2015-07-02 8 views
5

W dplyr, w jaki sposób wykonać sumowanie w wierszach w stosunku do wybranych kolumn (używając indeksu kolumny)?Jak wykonać sumowanie rzędów w wybranych kolumnach przy użyciu indeksu kolumny z dplyr?

To nie działa

> 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 

mogę wykonać następujące czynności, ale to nie jest piękne

> 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 
..  ... ...   ...   ...   ...   ... 

Czy istnieje bardziej składniowo ładniejszy sposobem osiągnięcia tego celu?

EDIT: To różni się od innych pytań, bo chcę zrobić rowwise operacji na kolumnach wybranych przez wykorzystaniem indeksów kolumn "

+6

Spróbuj 'iris%>% mutate (sum = Reduce (" + ",. [1: 4]))'. Alternatywnie, podstawowa funkcja 'rowSums' spełnia to, o co prosisz. – nicola

+2

możliwy duplikat [Zastosowanie funkcji do każdego wiersza tabeli przy użyciu dplyr?] (Http://stackoverflow.com/questions/21818181/applying-a-function-to-every-row-of-a-table-using -dplyr) – jeremycg

+0

'dplyr' oferuje funkcję' rowwise', która może być pomocna. – SabDeM

Odpowiedz

7

Jak już wspomniano w komentarzu, można wykonać zadanie z:

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

W tym przypadku także podstawa rowSums utwory:

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

(ab) można używać baza R: subset, który umożliwia wybór kolumn przez Numer:

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

Funkcja 'dplyr'' select' wydaje się działać poprawnie: 'iris%>% select (1: 4)%>% mutate (sum = rowSums (.))' ..? – Frank

0

Nie wiem, to jest poprawna etykieta ale wolę do recyklingu ten wątek zamiast rozpoczynania nowej podano, jestem całkiem pewny, robie tylko błąd rekrut .

Dlaczego to działa w porządku:

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

Chociaż jest (dla mnie identyczny) nie?

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

Błąd podana jest

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

mi walić głową na biurku od 30' lub tak!

Chciałbym móc podać podstawowy zbiór danych, ale naprawdę nie mogę.

Kolumna 1: 2 to pola tekstowe, natomiast 3: ncol (.) Mają wartości PRAWDA/FAŁSZ (logiczna). ncol (.) = 33.

Powiązane problemy