通过for循环将列添加到数据框

时间:2018-09-26 09:10:44

标签: r for-loop dataframe matrix

我有一个矩阵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),]))

1 个答案:

答案 0 :(得分:1)

如果您要优化而不是循环,请尝试在基数R中使用lapply,在该方法中,我们基于列表的每个元素中的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"))