web-dev-qa-db-fra.com

calculs dplyr mutent rowSums ou fonctions personnalisées

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))
53
leoluyi

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
100
docendo discimus

Une manière plus compliquée serait:

 iris %>% select(Sepal.Length:Petal.Width) %>%
mutate(sumVar = rowSums(.)) %>% left_join(iris)
12
Davide Passaretti

Ajout du commentaire de @ docendodiscimus comme réponse. +1 à lui!

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

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

1
Melkor.cz

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(.)))))
1
llewmills