dplyr mutate rowSums calculations or custom functions

Próbuję zmutować nową zmienną z obliczeń wiersza, powiedz {[3] } Jak poniżej

iris %>% 
  mutate_(sumVar = 
            iris %>% 
            select(Sepal.Length:Petal.Width) %>%
            rowSums)

Wynik jest taki, że "sumVar" jest obcięty do swojej pierwszej wartości (10.2):

Source: local data frame [150 x 6]
Groups: <by row>

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species sumVar
1           5.1         3.5          1.4         0.2  setosa   10.2
2           4.9         3.0          1.4         0.2  setosa   10.2
3           4.7         3.2          1.3         0.2  setosa   10.2
4           4.6         3.1          1.5         0.2  setosa   10.2
5           5.0         3.6          1.4         0.2  setosa   10.2
6           5.4         3.9          1.7         0.4  setosa   10.2
..
Warning message:
Truncating vector to length 1 

Czy powinno być stosowane rowwise? Albo jaki jest właściwy czasownik do użycia w tego rodzaju obliczeniach.

Edit:

Dokładniej, czy jest jakiś sposób, aby zrealizować inline niestandardową funkcję z dplyr?

Zastanawiam się, czy można zrobić coś takiego:

iris %>% 
  mutate(sumVar = colsum_function(Sepal.Length:Petal.Width))
 40
Author: leoluyi, 2014-12-08

5 answers

Jest to bardziej obejście, ale może być użyte

iris %>% mutate(sumVar = rowSums(.[1:4]))

Jak napisano w komentarzach, możesz również użyć select wewnątrz mutate, aby uzyskać kolumny, które chcesz podsumować, na przykład

iris %>% 
  mutate(sumVar = rowSums(select(., contains("Sepal")))) %>% 
  head 

Lub

iris %>% 
  mutate(sumVar = select(., contains("Sepal")) %>% rowSums()) %>% 
  head
 72
Author: docendo discimus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-07 07:21:45

Bardziej skomplikowanym sposobem byłoby:

 iris %>% select(Sepal.Length:Petal.Width) %>%
mutate(sumVar = rowSums(.)) %>% left_join(iris)
 11
Author: Davide Passaretti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-08 09:42:58

Dodanie komentarza @docendodiscimus jako odpowiedzi. +1 dla niego!

iris %>% mutate(sumVar = rowSums(select(., contains("Sepal"))))
 5
Author: psychonomics,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-24 14:35:12

Używam tego prostego rozwiązania, które jest bardziej solidną modyfikacją odpowiedzi Davide Passarettiego:

iris %>% select(Sepal.Length:Petal.Width) %>%
  transmute(sumVar = rowSums(.)) %>% bind_cols(iris, .)

(ale wymaga zdefiniowanej kolejności wierszy, co powinno być w porządku, chyba że pracujesz ze zdalnymi zbiorami danych..)

 0
Author: Melkor.cz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-12 19:19:56

Możesz również użyć grepa zamiast contains lub matches, na wszelki wypadek, gdybyś chciał się rozkoszować wyrażeniami regularnymi (matches nie wydaje się zbytnio podobać negatywnym spojrzeniom i tym podobnym z mojego doświadczenia).

iris %>% mutate(sumVar = rowSums(select(., grep("Sepal", names(.)))))
 0
Author: llewmills,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-20 06:34:12