通过for循环向数据帧添加列

通过for循环向数据帧添加列,r,for-loop,dataframe,matrix,R,For Loop,Dataframe,Matrix,我有一个矩阵数据和一个列表。我希望在列表中的每个向量与矩阵的行名称之间找到匹配项,计算它们的平均值,并将这些值添加到数据框df中,新的数据框列与列表中每个向量的名称具有相同的名称。 我已经手动完成了,但我想知道如何使用更高效的代码以for loop的方式完成 data <- matrix(runif(75, 5.0, 10), nrow = 15, ncol = 5) rownames(data) <- paste0("GENE",1:15) colnames(data) <

我有一个矩阵
数据
和一个
列表
。我希望在列表中的每个向量与矩阵的行名称之间找到匹配项,计算它们的平均值,并将这些值添加到数据框
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),]))

data如果您想优化而不是循环,请尝试在base R中使用
lappy
,我们根据列表中每个元素的
行名
对行进行子集,然后使用
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"))
set.seed(1234)

数据使用
set.seed
生成随机数据时,不要将变量命名为
list
,因为它是一个内部R函数。这非常有帮助!谢谢。%x部分中的“%s”剂量是多少?那么x是从哪里来的呢?因为当我在真实数据上尝试此操作时,我在colMeans(justRMA.batch[row.names(justRMA.batch)%in%x,])中得到一个错误:'x'必须是至少两个维度的数组'@symo我不确定您的真实数据与示例数据有何不同,但是您能检查
t(do.call(“rbind”),lappy(lst,function(x)colMeans吗(数据[rownames(data)%in%x,drop=FALSE]))
如果可行的话?仅供参考,使用
matrixStats::colMeans2(data,rows=rownames(data)%in%x)
colMeans(data[rownames(data)%in%x,drop=FALSE])内存效率更高,因为它完全避免了子集设置,因此速度也更快。