首页 > 解决方案 > 通过 for 循环将列添加到数据框中

问题描述

我有一个矩阵data和一个list. 我想在我的列表中的每个向量与我的矩阵的行名称之间找到匹配项,计算它们的平均值并将这些值添加到数据框中df,新数据框的名称与列表中每个向量的名称相同。我已经手动完成了,但我想知道如何for loop以更有效的代码方式完成它。

data <- matrix(runif(75, 5.0, 10), nrow = 15, ncol = 5)
rownames(data) <- paste0("GENE",1:15)

colnames(data) <- paste0("COL",1:5)
list <- list(n = c("GENE1","GENE2","GENE3"), s = c("GENE4", "GENE5","GENE6","GENE7"),b = c("GENE8","GENE10", "GENE12", "GENE15"))

df <- data.frame(row.names = colnames(data))
df$n <- matrixStats::rowMeans2(t(data[intersect(row.names(data),list$n),]))
df$s <- matrixStats::rowMeans2(t(data[intersect(row.names(data),list$s),]))
df$b <- matrixStats::rowMeans2(t(data[intersect(row.names(data),list$b),]))

标签: rfor-loopdataframematrix

解决方案


如果您想优化而不是循环,请尝试lapply在基础 R 中,我们根据rownames列表的每个元素对行进行子集化,然后使用colMeans.

t(do.call("rbind", lapply(lst, function(x) 
                   colMeans(data[rownames(data) %in% x,]))))


#            n        s        b
#COL1 7.242129 7.667626 6.980115
#COL2 7.317233 6.297818 6.186642
#COL3 6.709917 7.061652 7.552923
#COL4 7.773472 6.741069 7.765780
#COL5 7.039789 6.584206 7.569894

数据

set.seed(1234)
data <- matrix(runif(75, 5.0, 10), nrow = 15, ncol = 5)
rownames(data) <- paste0("GENE",1:15)

colnames(data) <- paste0("COL",1:5)
lst <- list(n=c("GENE1","GENE2","GENE3"), s = c("GENE4", "GENE5","GENE6","GENE7"),
    b = c("GENE8","GENE10", "GENE12", "GENE15"))

推荐阅读