如果我根据另一个向量y
中的类标签将我的数据矩阵拆分成行,那么结果就是“' name'像这样:
> X <- matrix(c(1,2,3,4,5,6,7,8),nrow=4,ncol=2)
> y <- c(1,3,1,3)
> X_split <- split(as.data.frame(X),y)
$`1`
V1 V2
1 1 5
3 3 7
$`3`
V1 V2
2 2 6
4 4 8
我想遍历结果并对每个矩阵执行一些操作,例如对元素求和或对列求和。如何访问循环中的每个矩阵,以便我可以这样做?
labels = names(X_split)
for (k in labels) {
# How do I get X_split[k] as a matrix?
sum_class = sum(X_split[k]) # Doesn't work
}
事实上,我根本不想处理数据帧和命名数组。有没有办法可以在没有split
的情况下调用as.data.frame
并获取矩阵或类似内容的列表?
答案 0 :(得分:3)
拆分而不转换为数据框
X_split <- list(X[c(1, 3), ], X[c(2, 4), ])
更一般地说,要根据长度为y
的向量nrow(X)
来表示,指示每行所属的组,您可以将其写为
X_split <- lapply(unique(y), function(i) X[y == i, ])
总结结果
X_sum <- lapply(X_split, sum)
# [[1]]
# [1] 16
# [[2]]
# [1] 20
(如果您希望将结果作为矢量,请使用sapply
答案 1 :(得分:3)
另一种选择不是首先拆分,而是按y
加总。这是一种可能的data.table
方法
library(data.table)
as.data.table(X)[, sum(sapply(.SD, sum)), by = y]
# y V1
# 1: 1 16
# 2: 3 20
答案 2 :(得分:1)
非常确定直接在矩阵上操作是最有效的:
tapply(rowSums(X),y,sum)
# 1 3
# 16 20