在以下矩阵数据集中:
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/