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