在以下矩阵数据集中:

       1  2   3   4   5
1950   7 20  21  15  61
1951   2 10   6  26  57
1952  12 27  43  37  34
1953  14 16  40  47  94
1954   2 17  62 113 101
1955   3  4  43  99 148
1956   2 47  31  85  79
1957  17  5  38 216 228
1958  11 20  15  76  68
1959  16 20  43  30 226
1960   9 28  28  70 201
1961   1 31 124  74 137
1962  12 25  37  41 200

我一直在尝试按十年来计算colSums,即从1950-1959年到1960-69年的每一列求和。

我尝试了tapply,ddply等,但无法弄清楚实际可行的方法。

最佳答案

首先,我们设置用作输入的矩阵。

Lines <- "1  2   3   4   5
1950   7 20  21  15  61
1951   2 10   6  26  57
1952  12 27  43  37  34
1953  14 16  40  47  94
1954   2 17  62 113 101
1955   3  4  43  99 148
1956   2 47  31  85  79
1957  17  5  38 216 228
1958  11 20  15  76  68
1959  16 20  43  30 226
1960   9 28  28  70 201
1961   1 31 124  74 137
1962  12 25  37  41 200  "
DF <- read.table(text = Lines, check.names = FALSE)
m <- as.matrix(DF)

现在,在下面,我们显示一些替代解决方案。 (1)似乎最灵活,因为我们可以轻松地用其他函数替换sum以获得不同的效果,但(2)对于这个特定问题最短。另请注意,有一些细微的差异。 (1)产生一个data.frame,而另外两个产生一个矩阵。

1)aggregate
decade <- 10 * as.numeric(rownames(m)) %/% 10
m.ag <- aggregate(m, data.frame(decade), sum)

这给出了这个data.frame:
> m.ag
  decade  1   2   3   4    5
1   1950 86 186 342 744 1096
2   1960 22  84 189 185  538

2)rowsum 这个比较短。它产生矩阵结果。
rowsum(m, decade)

3)split/sapply 。这也产生一个矩阵。如果我们有DF,我们可以用DF替换as.data.frame(m),将其略微缩短。
t(sapply(split(as.data.frame(m), decade), colSums))

编辑:添加了解决方案(2)和(3)添加了一些说明。

关于r - R ColSums按组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9084439/

10-12 18:06