2016-09-24 55 views
1

我有一个文本文件有两列(也许它只是标签?)。其中一列的数据如下所示:TC012950_CDS_3428_4122
第一个数字是TC#,第二个CDS,第三个起始位置,第四个结束位置。 其他列有一个值是这样的:11.93631拆分列数据,添加数据,重新合并在一起

我有一个包含由制表分裂染色体信息的另一个文本文件:

ChLG10 protein_coding表达3428 5582。 - 。 TC012950

我的首要目标是最终结合染色体名称(ChLG10)进入第一个文件的列,因此它看起来像: TC012950_ChLG10_3428_4122
与第二列仍包含其原始值。

我已经尝试把数据放入数组或数据框,但然后我很难分裂第一列。我不断收到错误,说更换有0行等。因此,我希望也许有人在这里指出我正确的方向。

如何使用_将第一列分成多列?有没有办法将它们分成多个标签? 之后,我需要将每行与其他数据中的相应行进行匹配,以便我可以将Chr位置列放在TC#和CDS列之间。一旦位于正确的位置,那么我需要将所有列重新合并在一起,并用_分隔。我在想,如果我用tab做了什么,那么我会再用_替换这个选项卡?任何建议或帮助是值得欢迎的。提前感谢你!

+1

有做你的无穷的方法'问,但我们需要一些数据。 – Abdou

回答

0

您可以在sub函数中使用正则表达式将所需值放入第一列。我只是用两个数据帧伪造你的数据。是

dat1<-data.frame(V1='TC012950_CDS_3428_4122', Value='11.93631', stringsAsFactors=F) 
print(dat1) 
        V1 Value 
1 TC012950_CDS_3428_4122 11.93631 

dat2<-data.frame(V1='ChLG10',V2='protein_coding', V3='mRNA') 
print(dat2) 
     V1    V2 V3 
1 ChLG10 protein_coding mRNA 

# loop over the rows in the data.frames 
for (i in 1:nrow(dat1)) { 
    dat1$V1[i] <- sub('_[A-Za-z0-9]+_',paste('_',dat2$V1[i],'_',sep=''),dat1$V1[i]) 
} 
print(dat1) 
        V1 Value 
1 TC012950_ChLG10_3428_4122 11.93631 

sub的参数如下所示:寻找—一个或多个数字或字母之间有两个 下划线

  1. 图案;在这种情况下,字符类(\\w)将不起作用,因为它们之间包含下划线
  2. 字符串以及来自第二个文件 的所需代码; paste只是串接,并使用一个空字符串 隔板
  3. 目标串来修改(第二文件的第一列)

sub将仅更换第一次出现。

0

将列分成多列的一种方法是通过tidyr::separate。分开后,您可以使用tidyr::unite将它们再次合并。

library(tidyr) 
df = data.frame(A = c("1_2_3","4_5_6")) 
df2 = df%>%separate(col="A",into=c("A","B","C"),sep = "_") 

输出:

A B C 
1 1 2 3 
2 4 5 6 

然后可以团结柱以任何顺序如下:

df2%>%unite(col="new",B,C,A,sep="_") 

输出:

new 
1 2_3_1 
2 5_6_4