2016-05-07 1 views
-1

Je suis un débutant à R et demander de l'aide pour calculer les sommes de la colonne sélectionnée pour chaque ligne. Mon cadre de données simple est comme ci-dessous.Comment obtenir rowSums pour les colonnes sélectionnées dans R

data = data.frame(location = c("a","b","c","d"), 
      v1 = c(3,4,3,3), v2 = c(4,56,3,88), v3 =c(7,6,2,9), v4=c(7,6,1,9), 
      v5 =c(4,4,7,9), v6 = c(2,8,4,6)) 

Je veux somme des colonnes V1 à V3 et V4 à V6 pour ma chaque rangée dans une nouvelle trame de données.

x1 x2 
a 14 13 
b 66 18 
c 
d 

J'ai fait quelque chose comme ci-dessous.

rowSums(data[,2:4][,5:7]) 

Mais quelque chose devrait être faux dans mes codes. Merci d'avance pour votre aide.

Répondre

1

Voici une solution assez simple en utilisant apply.

output <- data.frame(x1 = apply(data[2:4], 1, sum) , 
         x2 = apply(data[5:7], 1, sum)) 

Résultat:

output 
> x1 x2 
> 1 14 13 
> 2 66 18 
> 3 8 12 
> 4 100 24 
0

Spécification des deux sommations explicitement:

cbind(x1=rowSums(data[,c('v1','v2','v3')]),x2=rowSums(data[,c('v4','v5','v6')])); 
##  x1 x2 
## [1,] 14 13 
## [2,] 66 18 
## [3,] 8 12 
## [4,] 100 24 
+0

ensemble de données réelles a obtenu un grand nombre de variables. – sriya

0

Nous pouvons split l'ensemble de données dans un list puis utilisez Reduce avec f="+".

sapply(split.default(data[-1], rep(paste0("x", 1:2), each=3)), Reduce, f=`+`) 
#  x1 x2 
#[1,] 14 13 
#[2,] 66 18 
#[3,] 8 12 
#[4,] 100 24 
+0

Toutes les réponses fonctionnent bien. Merci . @ Akrun qu'est-ce que Réduire, f = '+' faire ici s'il vous plaît? – sriya

+0

@Lio 'f' est l'appel de fonction à l'intérieur de' Reduce'. Il fait la somme de chaque élément dans une ligne particulière du data.frame. – akrun

1

Mon sens serait d'utiliser dPly:

require(dply) 
data %>% mutate(v2v4 = rowSums(.[2:4])) %>% mutate(v4v6 = rowSums(.[5:7])) %>% select(-(location:v6)) 

Résultat:

> newDf <- data %>% mutate(v2v4 = rowSums(.[2:4])) %>% mutate(v4v6 = rowSums(.[5:7])) %>% select(-(location:v6)) 
> newDf 
    v2v4 v4v6 
1 14 13 
2 66 18 
3 8 12 
4 100 24 
1

OK, si vous voulez une trame de données séparée:

> data.frame(X1=rowSums(data[,2:4]), X2=rowSums(data[,5:7])) 
+0

cette réponse ne retourne pas la sortie désirée dans 'data.frame' –

+1

Je ne l'ai jamais dit. J'ai dit que vous devez utiliser rowSums (data [, c (2: 4,5: 7)]) au lieu de rowSums (data [, 2: 4] [, 5: 7]). Si vous voulez un dataframe, il vous suffit de le combiner. – Juanjo

+0

Je pense toujours que votre réponse ne renvoie pas le résultat demandé dans les questions, ce qui serait un 'data.frame' comme ceux que vous pouvez voir dans les autres réponses –