2015-07-02 14 views
5

In dplyr, come si esegue la sommatoria rowwise sulle colonne selezionate (utilizzando l'indice delle colonne)?Come eseguire la sommatoria rowwise sulle colonne selezionate usando l'indice delle colonne con dplyr?

Questo non funziona

> iris %>% mutate(sum=sum(.[1:4])) %>% head 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species sum 
1   5.1   3.5   1.4   0.2 setosa 2078.7 
2   4.9   3.0   1.4   0.2 setosa 2078.7 
3   4.7   3.2   1.3   0.2 setosa 2078.7 
4   4.6   3.1   1.5   0.2 setosa 2078.7 
5   5.0   3.6   1.4   0.2 setosa 2078.7 
6   5.4   3.9   1.7   0.4 setosa 2078.7 

posso fare quanto segue, ma non è bello

> iris %>% mutate(index=1:n()) %>% 
       gather("param", "value", 1:4) %>% 
       group_by(index) %>% 
       mutate(sum=sum(value)) %>% 
       spread(param, value) %>% select(-index) 
Source: local data frame [150 x 6] 

    Species sum Sepal.Length Sepal.Width Petal.Length Petal.Width 
1 setosa 10.2   5.1   3.5   1.4   0.2 
2 setosa 9.5   4.9   3.0   1.4   0.2 
3 setosa 9.4   4.7   3.2   1.3   0.2 
4 setosa 9.4   4.6   3.1   1.5   0.2 
5 setosa 10.2   5.0   3.6   1.4   0.2 
6 setosa 11.4   5.4   3.9   1.7   0.4 
7 setosa 9.7   4.6   3.4   1.4   0.3 
8 setosa 10.1   5.0   3.4   1.5   0.2 
9 setosa 8.9   4.4   2.9   1.4   0.2 
10 setosa 9.6   4.9   3.1   1.5   0.1 
..  ... ...   ...   ...   ...   ... 

C'è più sintatticamente modo più bello per raggiungere questo obiettivo?

EDIT: E 'diverso da altre questioni, perché voglio fare il funzionamento rowwise sulle colonne selezionate da indici colonna utilizzando "

+6

Prova 'iris%>% mutate (sum = Reduce (" + ",. [1: 4]))'. In alternativa, la funzione 'rowSums' di base fa quello che stai chiedendo. – nicola

+2

possibile duplicato di [Applicazione di una funzione a ogni riga di una tabella utilizzando dplyr?] (Http://stackoverflow.com/questions/21818181/applying-a-function-to-every-row-of-a-table-using -dplyr) – jeremycg

+0

'dplyr' offre la funzione' rowwise' che potrebbe essere utile. – SabDeM

risposta

7

Come detto già nel commento, è possibile compiere il proprio compito con:

iris %>% mutate(sum=Reduce("+",.[1:4])) 

Anche in questo caso le opere di base rowSums:

iris$sum<-rowSums(iris[,1:4]) 
2

(ab) È possibile utilizzare la base di subset R, che permette la selezione di colonne numero:

iris %>% subset(select=1:4) %>% mutate(sum=rowSums(.)) 
+3

La funzione 'dplyr'' select' sembra funzionare correttamente: 'iris%>% select (1: 4)%>% mutate (sum = rowSums (.))' ..? – Frank

0

Non è sicuro questo è corretto galateo ma preferisco di riciclare questa discussione invece di iniziare un nuovo dato, io sono abbastanza sicuro, io sto facendo solo un errore da rookie .

Perché questo lavoro va bene:

test$sum <- Reduce("+", test[,3:ncol(test)]) 

mentre questo (a me identici) non?

test %>% 
    mutate(sum = Reduce("+",.[3:ncol(.)])) 

L'errore dato è

Error in mutate_impl(.data, dots) : 
    Column `sum` must be length 1 (the group size), not 915 

sto sbattere la testa sulla scrivania dal 30' o giù di lì!

Vorrei poterti fornire il set di dati sottostante ma non posso.

Colonna 1: 2 sono campi di testo mentre 3: ncol (.) Sono VERO/FALSO (logici). ncol (.) = 33.

Problemi correlati