2015-08-28 9 views
1

У меня есть два больших файла, и я пытаюсь сопоставить информацию из первого столбца файла_1 с заголовком файла_2. Существует небольшая деталь, заголовок файла_2 имеет некоторую информацию в начале, которая варьируется от столбца к столбцу, но в конце имеет совпадение с шаблоном. В принципе, мне нужно найти, где 'pattern' из файла_1 присутствует в конце имени файла 2 файла и выводить данные с этой информацией.
Пожалуйста, смотрите ниже, как файлы выглядеть следующим образом:Совпадение «шаблона» от одного файла к имени заголовка в другом (R, Unix)

**file_1** dim (757*3) the first column of the file_1 contains patterns 
10001-101A3 a t 
10008-101B6 b g 
10235-104A1 c h 
-   - - 
-   - - 
etc... 

**file_2** dim (4120*1079) 
blabla.10001.101A3 blbl.2348.101B6 trsdr.1111.111D2 gfder.10008.101B6 .... 
12       1223   544    -    - 
132       23   3564    -    - 
14       223   33    -    - 
162       13   344    -    - 


**Desired output file-3:** I assume that the output size will be 4120*757 
blabla.10001.101A3 gfder.10008.101B6 .... 
12     -    - 
132     -    - 
14     -    - 
162     -    - 

Я пытаюсь получить выход с R (ниже мой сценарий), но я также хотел бы узнать, как я могу это сделать в Unix (я думаю, -awk и -grep могут помочь решить эту проблему).

вот мой R сценарий:

table1=read.table("file2.tsv.gz", quote=NULL, sep='\t', header=T, fill=T) 
table2=read.table("file1.txt", quote=NULL, sep='\t', header=T, fill=T) 
    # dim(table1 4120 * 1079) -> need to reduce amount of columns to 757 
    # dim(table2 757 * 3) 

###### the header in table1 has following view 10001.101A3, thus we need to substitute '-' to '.' in pattern 
### What to do: 
### 1) Use gsub() function to substitute '-' by '.' 
### 2) Use gsub() function to remove space in the end of string ' ' by '' 
### 3) Find modified pattern in the end of column's name 
### 4) Apply to the entire table 

pattern=table2[,1]   # '10001-101A3 ' '10008-101B6 ' 
for (x in pattern) { 
    ptn=gsub('-','.',x) 
    ptn1=gsub(' ','',ptn)   # pattern to be matched' 
            # '10001.101A3' '10008.101B6' 

    find_match=table1[,(grepl('^.+ptn1$', header))] 
    final_tb=table1[,find_match] 
} 

Я думаю, что проблема с представлением данных ptn1 в grepl() функции, потому что, когда я вставить 10001.101A3 вместо ptn1 я получаю ответ за один прогон , но, очевидно, мне нужно зациклиться на нем.

Я также попытался получить (ptn1), но все равно не мог заставить его работать.

Буду признателен за ваши комментарии, а также за любые идеи о том, как это можно сделать в Unix (я очень простой пользователь Unix, поэтому не могу реализовать эту задачу на данный момент).

######################## след на малых данных
df=data.frame(aa24.12a,dda43.23s,fds24.12a,sdf24.112f) 

г = с ('24 -12a», '43 - 23s «) # образец

aa24.12a fds24.12a aa24.12a.1 fds24.12a.1 
1  2  34   2   34 
2  3   2   3   2 
3  4   1   4   1 
4  56   3   56   3 
5  3   5   3   5 


header=colnames(df) 
for (x in z){ 
    ptn=gsub('-','.',x) 
    ptn1=gsub(' ','',ptn)# correct pattern 

    find_match=grep('^.+24.12a$', header)# find match of pattern in header 
    tbl=df[,find_match] 
} 
> tbl 
    aa24.12a fds24.12a 
1  2  34 
2  3   2 
3  4   1 
4  56   3 
5  3   5 

Спасибо

ответ

-1

благодарственного вы N8TRO, для вас решение и быстрый ответ.

Мое собственное решение вопроса, я спросил:

# Modify pattern z=('24-12a','43-23s') 
ptn=gsub('-','.',z) 
ptn1=gsub(' ','',ptn) 
# so no it looks like '24.12a' '34.23s' 

i=1   
# create empty vector 
df2=c()   
# Iterate: 
# first loop through column names of data frame 
# second loop goes through vector's value 
# grepl -> searches for matches 
# condition, ==TRUE 
# if so: append to the empty vector, values in the vector will be column numbers 

for (x in colnames(df)){ 
    for (y in ptn1){ 
     e=grepl(y,x) 
      if (e==TRUE){ 
       df2=append(df2,i) 
     } 
    } 
    i=i+1 
} 

desired_output = ДФ [, df2]

1

Я уверен, что есть что-то более краткое, но используя быстрый Hack однострочник:

read.table(text= 
"**file_1** dim (757*3) the first column of the file_1 contains patterns 
10001-101A3 a t 
10008-101B6 b g 
10235-104A1 c h", 
comment.char="*") -> dat1 

read.table(text=" 
**file_2** dim (4120*1079) 
blabla.10001.101A3 blbl.2348.101B6 trsdr.1111.111D2 gfder.10008.101B6 .... 
12       1223   544    -    - 
132       23   3564    -    - 
14       223   33    -    - 
162       13   344    -    -", 
comment.char="*", header=TRUE) -> dat2 


dat2[,unlist(sapply(dat1[,1], function(x) grep(sub(x, pattern="-", replacement="."), colnames(dat2))))] 

# blabla.10001.101A3 gfder.10008.101B6 
#1     12     - 
#2    132     - 
#3     14     - 
#4    162     - 

 Смежные вопросы

  • Нет связанных вопросов^_^