如何根据数据框的列名中的多个列前缀字符串提取多个列?
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 = ""))
})
}
我正在努力在 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 = ""))
})
}