J'essaie de muter une nouvelle variable à partir d'une sorte de calcul de ligne, disons rowSums
comme ci-dessous
iris %>%
mutate_(sumVar =
iris %>%
select(Sepal.Length:Petal.Width) %>%
rowSums)
le résultat est que "sumVar" est tronqué à sa première valeur (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
Devrait-il être appliqué rowwise
? Ou quel est le bon verbe à utiliser dans ce type de calcul.
Edit:
Plus précisément, y a-t-il un moyen de réaliser la fonction personnalisée en ligne avec dplyr
?
Je me demande s'il est possible de faire quelque chose comme:
iris %>%
mutate(sumVar = colsum_function(Sepal.Length:Petal.Width))
Ceci est plus une solution de contournement mais pourrait être utilisé
iris %>% mutate(sumVar = rowSums(.[1:4]))
Comme écrit dans les commentaires, vous pouvez également utiliser un select
à l'intérieur de mutate pour obtenir les colonnes que vous souhaitez résumer, par exemple
iris %>%
mutate(sumVar = rowSums(select(., contains("Sepal")))) %>%
head
ou
iris %>%
mutate(sumVar = select(., contains("Sepal")) %>% rowSums()) %>%
head
Une manière plus compliquée serait:
iris %>% select(Sepal.Length:Petal.Width) %>%
mutate(sumVar = rowSums(.)) %>% left_join(iris)
Ajout du commentaire de @ docendodiscimus comme réponse. +1 à lui!
iris %>% mutate(sumVar = rowSums(select(., contains("Sepal"))))
J'utilise cette solution simple, qui constitue une modification plus robuste de la réponse de Davide Passaretti:
iris %>% select(Sepal.Length:Petal.Width) %>%
transmute(sumVar = rowSums(.)) %>% bind_cols(iris, .)
(Mais cela nécessite un ordre de lignes défini, ce qui devrait être correct, sauf si vous travaillez avec des ensembles de données distants, peut-être ..)
Vous pouvez également utiliser un grep à la place de contains
ou matches
, juste au cas où vous auriez besoin de fantaisie avec les expressions régulières (matches
ne semble pas beaucoup négatif regards et autres dans mon expérience).
iris %>% mutate(sumVar = rowSums(select(., grep("Sepal", names(.)))))