2012-01-31 79 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