r - 通过 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),]))
解决方案
如果您想优化而不是循环,请尝试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"))
推荐阅读
- javascript - Squarespace - 根据博客标签更改 CSS 元素
- reactjs - TS2345 void 类型的参数不可分配 | 反应 useState 钩子 + 承诺
- machine-learning - 使用一个热向量作为训练标签时出错
- discord.py - 将用户移动到不同的 VC discord.py
- linux - 如何在 Unix 或 Linux 环境下查看父子进程、僵尸进程、守护进程?
- python-3.x - 如何在 discord.py 中为命令传递可选参数
- r - 如何在对另一列中的关联值求和时更改列中的年龄括号?
- python - Python/Pandas:重塑和合并数据框,并匹配一些元素
- terraform - 创建 GKE 集群时,此处不应使用名为“networking_mode”的参数
- r - 合并 4 列使其成为 R 中的一列