2015-09-16 16 views
16

Utilizzando dplyr, si può fare qualcosa di simile:dplyr: come fare riferimento a colonne per indice di colonna piuttosto che nome di colonna usando mutate?

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

Ma soprattutto, ho fatto riferimento le colonne con i loro nomi delle colonne. Come posso usare 1 e 2, che sono gli indici delle colonne per ottenere lo stesso risultato?

Qui ho il seguente, ma ritengo che non sia elegante.

iris %>% head %>% mutate(sum=apply(select(.,1,2),1,sum)) 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species sum 
1   5.1   3.5   1.4   0.2 setosa 8.6 
2   4.9   3.0   1.4   0.2 setosa 7.9 
3   4.7   3.2   1.3   0.2 setosa 7.9 
4   4.6   3.1   1.5   0.2 setosa 7.7 
5   5.0   3.6   1.4   0.2 setosa 8.6 
6   5.4   3.9   1.7   0.4 setosa 9.3 

risposta

26

Si può provare:

iris %>% head %>% mutate(sum = .[[1]] + .[[2]]) 

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species sum 
1   5.1   3.5   1.4   0.2 setosa 8.6 
2   4.9   3.0   1.4   0.2 setosa 7.9 
3   4.7   3.2   1.3   0.2 setosa 7.9 
4   4.6   3.1   1.5   0.2 setosa 7.7 
5   5.0   3.6   1.4   0.2 setosa 8.6 
6   5.4   3.9   1.7   0.4 setosa 9.3 
+5

Nota questo non si combinano bene con 'group_by':.' Iris%>% group_by (Specie)%>% mutare (somma = [[1] ] +. [[2]]) 'considerando che' iris%>% group_by (Specie)%>% mutate (somma = Sepal.Length + Sepal.Width) 'fa. – MrFlick

+1

@MrFlick - Forse mi manca qualcosa. Perché il raggruppamento conta quando si calcolano le righe? Potrebbero probabilmente lanciare un 'ungroup()' e quindi riorganizzarsi se stanno facendo altre operazioni. Ho trovato necessario prima. –

+4

@RichardScriven È più di un avvertimento che questo metodo sta davvero bypassando gran parte dell'infrastruttura di dplyr in modo che possa rompere cose come il raggruppamento che altrimenti dovrebbe funzionare. Stai essenzialmente saltando il parametro 'data =' di mutate. Hai ragione che questo non ha importanza per un 'mutate()' di riga, ma considera: 'iris%>% group_by (Specie)%>% riepiloga (x = mean (. [[1]] +. [[2]])) 'Questo non è un buon metodo" generale "per specificare le colonne per indice. – MrFlick

Problemi correlati