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))
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
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)
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"))))
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..)
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(.)))))
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