【问题标题】:Add columns to a data frame by for loop通过 for 循环将列添加到数据框中
【发布时间】:2019-03-02 00:19:46
【问题描述】:

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

【问题讨论】:

  • 在生成随机数据时使用set.seed,不要将变量命名为list,因为它是一个内部R函数。

标签: r for-loop dataframe matrix


【解决方案1】:

如果您想优化而不是循环,请尝试使用 base 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"))

【讨论】:

  • 这对 Ronak 很有帮助!多谢。 '%in% x' 部分的剂量是多少? x 是从哪里来的?因为当我在我的真实数据上尝试这个时,我得到一个错误' colMeans(justRMA.batch[row.names(justRMA.batch) %in% x, ]) 中的错误:'x' 必须是至少二维的数组'
  • @symo 我不确定您的真实数据与样本数据有何不同,但您能否检查t(do.call("rbind", lapply(lst, function(x) colMeans(data[rownames(data) %in% x, , drop = FALSE])))) 是否可行?
  • 仅供参考,使用 matrixStats::colMeans2(data, rows = rownames(data) %in% x)colMeans(data[rownames(data) %in% x, , drop = FALSE]) 更节省内存,因为它完全避免了子集,因此也更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2022-01-20
  • 1970-01-01
  • 2021-07-01
  • 2020-04-25
  • 2021-02-01
  • 1970-01-01
相关资源
最近更新 更多