2015-09-01 1 views
1

C'est frustrant, car il semble que cela devrait être si simple, mais c'est sucer des heures. Je souhaite obtenir les sommes de lignes pour une liste de colonnes dans une trame de données, mais cette liste - qui est définie par l'utilisateur - peut très bien être une longueur 1, c'est-à-dire un numéro de colonne.R: Somme des rangs pour 1 ou plusieurs colonnes

rowSums ne permet pas de sommer 1 colonne.

rowsum utilise un groupe que j'ai trouvé complètement indécrissable. J'ai joué avec l'exemple depuis des lustres et je n'ai toujours pas la moindre idée de quoi il s'agit, mais cela ne peut pas être omis. La meilleure réponse here utilise rowSums ou apply; la seconde utilise .SD et lapply mais utilise := et .SD et d'autres termes qui n'apparaissent pas dans R help, et que je n'avais pas vu auparavant, ce qui ouvre juste un autre trou de ver de recherche et de confusion.

Alors: est-ce que je peux utiliser pour:

x <- matrix(runif(100), ncol = 5) 
goodcols <- c(1,3,5) 
y <- rowSums(x[,goodcols]) 

qui fonctionnerait avec 1 ou> 1 goodcols?

Merci d'avance. Actuellement, je suis à la recherche à l'aide:

ifelse(length(goodcols)>1, 
y<-rowSums(x[,goodcols]), 
y<-x[,goodcols]) 
+3

il suffit d'utiliser 'goutte = FALSE' pour éviter x étant changé dans un vecteur quand il n'y a qu'une seule colonne. '.SD' et': = 'sont la syntaxe du paquet' data.table'. Une dernière chose, mettez 'y <- rowSums (x [, goodcols])' au lieu de 'y <- rowSums [, goodcols]', cela devrait fonctionner mieux ;-) (donc vous avez besoin de 'y <- rowSums (x [, goodcols, drop = F]) ') – Cath

Répondre

4

Lorsque vous avez une seule colonne de gauche dans un data.frame, matrix ou array, R à un contraint vector. Pour conserver les dimensions, vous devez utiliser le paramètre drop.
Drop est défini (comme vous pouvez le lire dans help("[.data.frame")) par:

logique. Si TRUE, le résultat est contraint à la dimension la plus faible possible. La valeur par défaut est de laisser tomber s'il ne reste qu'une seule colonne, mais de ne pas la laisser tomber si une seule ligne est laissée.

Ainsi, dans votre cas, vous devez utiliser le code suivant si vous voulez rowSums travailler quel que soit le nombre de colonnes est:

y <- rowSums(x[, goodcols, drop = FALSE])