6
votes

R colsums par groupe

Dans le jeu de données Matrix suivant:

       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  


0 commentaires

4 Réponses :


2
votes

par est une option: xxx


0 commentaires

3
votes

Il pourrait y avoir une solution de base plus élégante, mais cela fonctionne.

# 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


0 commentaires

14
votes

Nous configurons d'abord la matrice utilisée comme entrée.

t(sapply(split(as.data.frame(m), decade), colSums))


1 commentaires

+1 pour rowsum () . Merci d'élargir votre réponse pour inclure ces options supplémentaires.



6
votes

Vous devez d'abord définir une variable de regroupement, vous pouvez utiliser votre outil de choix ( agrégat code>, ddply code>, quoi que ce soit).

> 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


1 commentaires

C'est ce que je voulais dire par "plus élégant". Très agréable.