2017-05-08 65 views
0

我很努力地在R中写入多个csv文件,这些文件是基于196个列的单个数据框中的多个列名称子字符串。暗淡= [44196]首先4列和行看起来像:如何基于数据框的多个字符串中的多个字符串提取多个列?

 X1_tumor X1_normal X2_tumor X2_normal 
gene   5   7  8  11 
gene2  7   4  9   4 
gene3  6   7  6   7 
gene4  9   8  9  87 

子样本这里示出第一次的两个98个不同样品的特征向量:

[1] "X1_tumor" "X1_normal" 

我想以提取对计数根据减法计数的名称(例如前2个字符“1_”)中的文本匹配,并将它们写入单独的csv文件,产生98个csv文件,其中包含两列计数,例如:columns = 1_tumor和1_normal

我有尝试了很多东西,包括:

for subsamples in subtractedcounts 
{{(lapply(subsamples, 
function(y)substring((subsamples[seq(1,98,1)])1,2), y = n) { 
lapply(subsamples, function(x) write.csv(subtractedcounts[,grepl("n",colnames(subtractedcounts))], paste(x, ".csv", sep = ""))) 
}} 

这将返回98个适当命名的csv文件,但包含全部196列(即,减去的计数的全部)。我只想要两列包含适当的子字符串,如“1_”。理想的情况是这样的:

 X1_tumor X1_normal 
gene   5   7 
gene1  7   4 
gene2  6   7 
gene4  9   8 

的subtractedcounts rownames目前正在返回该.csv的,我想继续做的第一列(我的数据帧)。

感谢您的帮助。使用

回答

0

下面的例子:

df = data.frame(x1_normal = c(7,4,7,8), 
       x1_tumor = c(5,7,6,9), 
       x15_tumor = c(15,17,16,19), 
       x3_tumor = c(35,37,36,39), 
       x15_normal = c(17,14,17,18), 
       x3_normal = c(37,34,37,38)) 
row.names(df) = c("gene","gene2","gene3","gene4") 

> df 
     x1_normal x1_tumor x15_tumor x3_tumor x15_normal x3_normal 
gene   7  5  15  35   17  37 
gene2   4  7  17  37   14  34 
gene3   7  6  16  36   17  37 
gene4   8  9  19  39   18  38 

正如你所看到的列混合。此外假设,每x??_tumor有相应x??_normal

首先列名通过它们成对排序,然后循环:

sortedNames = sort(colnames(df)) 

for(k in seq(1,ncol(df),2)){ 
    print(df[,c(sortedNames[k],sortedNames[k+1])]) 
} 

我用过的打印,但您可以通过更换write.csv并使用通过在_之前提取字符串获得的文件名sortedNames[k]

循环结果:

 x1_normal x1_tumor 
gene   7  5 
gene2   4  7 
gene3   7  6 
gene4   8  9 

     x15_normal x15_tumor 
gene   17  15 
gene2   14  17 
gene3   17  16 
gene4   18  19 

     x3_normal x3_tumor 
gene   37  35 
gene2  34  37 
gene3  37  36 
gene4  38  39 
0

谢谢,R. Schifini。我还能够使用以下方式使其工作:

for(z in subsamples[1:98]) 
{ lapply(z, function(x) write.csv(subtractedcounts[,grepl(z,colnames(subtractedcounts))], paste(x, ".csv", sep = ""))) 
} 
相关问题