如何根据数据框的列名中的多个列前缀字符串提取多个列?

How can I extract multiple columns based on multiple column-prefix strings within a data frame's colnames?

我正在努力在 R 中根据来自具有 196 列的单个数据框 subtractedcounts 的多个列名称子字符串编写多个 CSV 文件。 dim = [44,196] 前 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
....

subsamples 是这里显示的前两个样本的 98 个不同样本的特征向量:

[1] "X1_tumor"  "X1_normal"

我想根据 subtractedcounts 的列名中的匹配文本提取计数对,例如前 2 个字符“1_”,并将它们写入单独的 csv 文件,产生 98 个包含两列的 csv 文件计数,例如:列 = 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 = "")))
}}

这 returns 98 个 CSV 文件适当命名但包含所有 196 列(即 subtractedcounts 的全部)。我只想要包含适当子字符串的两列,例如 "1_" 。理想情况下,它看起来像:

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

subtractedcounts 行名当前作为 .csv 的第一列返回,我想继续这样做。

使用以下示例:

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])])
}

我用的是print,不过你可以用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

谢谢,R. Schifini。我还能够使用以下方法让它工作:

for (col in subsamples[1:98]) {
  lapply(col, function(colname) {
     write.csv(subtractedcounts[,grepl(col,colnames(subtractedcounts))],
       paste(colname, ".csv", sep = ""))
  })
}