我有两个大文件,我正在尝试将file_1第一列的信息与file_2的标头进行匹配。有一个小细节,file_2的标题在开头有一些信息,这些信息因列而异,但最后它有模式匹配。基本上,我必须在文件2的列名称的末尾找到file_1中的'pattern',并输出带有此信息的data.frame。
请参阅下面文件的样子:
**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可以帮助解决这个问题)。< / p>
这是我的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]
}
我认为问题在于grep()函数中ptn1的数据表示,因为当我插入10001.101A3而不是ptn1时,我得到一次运行的答案,但显然我需要循环它。
我也尝试过get(ptn1),但仍然无法正常工作。
我将非常感谢您的评论,以及任何想法如何在Unix中使用(我是Unix的基本用户,因此目前无法实现此任务)。
关于小数据的########################跟踪df=data.frame(aa24.12a,dda43.23s,fds24.12a,sdf24.112f)
z = c('24 -12a','43 -23s')#pattern
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
谢谢
答案 0 :(得分:1)
我确定有更简洁的东西,但使用快速黑客单行:
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 -
答案 1 :(得分:-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 = df [,df2]