命名数组,数据帧和矩阵

时间:2015-05-08 11:27:21

标签: r

如果我根据另一个向量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并获取矩阵或类似内容的列表?

3 个答案:

答案 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