2012-01-31 56 views
4

在下面的矩阵数据集:- [R colSums通过

 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年至1969年等。

我尝试了tapply,ddply等,但无法弄清楚事实上会发挥作用的东西。

回答

12

试试这个。首先,我们建立了矩阵:

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)aggregate

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

其给出:

> 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而不是m开头。鉴于m我们可以恢复DF这样的:DF <- as.data.frame(m)

t(sapply(split(DF, decade), colSums)) 

编辑:增值解决方案(2)和(3)

+1

+1 rowsum()'。感谢您扩大您的答案,包括那些额外的选项。 – 2012-01-31 18:56:07

2

by是一个选项:

by(x,10*(as.numeric(rownames(x))%/%10),colSums) 
INDICES: 1950 
    1 2 3 4 5 
    86 186 342 744 1096 
------------------------------------------------------------ 
INDICES: 1960 
    1 2 3 4 5 
22 84 189 185 538 
3

有可能是一个更优雅的基础R解决方案,但这个工作。

# Construct a nicely named vector with which to split your data.frame 
breaks <- seq(1950, 2000, by=10) 
names <- c("50's", "60's", "70's", "80's", "90's") 
decade <- cut(as.numeric(row.names(df)), 
       seq(1950, 2000, by=10), labels=names, right=FALSE) 

# by() splits df apart, operating on each of its pieces. 
# do.call(rbind, ...) sutures the results back together. 
do.call(rbind, by(df, decade, colSums)) 
#  X1 X2 X3 X4 X5 
# 50's 86 186 342 744 1096 
# 60's 22 84 189 185 538 
6

您首先需要定义一个分组变量,那么你可以使用你选择的工具(aggregate,ddply,无论如何)。

> aggregate(x, by=list(trunc(as.numeric(rownames(x))/10)), sum) 
    Group.1 X1 X2 X3 X4 X5 
1  195 86 186 342 744 1096 
2  196 22 84 189 185 538 
+0

这就是我所说的“更优雅”的意思。非常好。 – 2012-01-31 18:43:21