studio - tidyr r
dplyr mutate row Cálculos de sumas o funciones personalizadas (5)
Estoy tratando de mutar una nueva variable del tipo de cálculo de fila, digamos
rowSums
como se muestra a continuación
iris %>%
mutate_(sumVar =
iris %>%
select(Sepal.Length:Petal.Width) %>%
rowSums)
el resultado es que "sumVar" se trunca a su primer valor (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
¿Se debe aplicar
rowwise
?
O cuál es el verbo correcto para usar en este tipo de cálculos.
Editar:
Más específicamente, ¿hay alguna forma de realizar la función personalizada en línea con
dplyr
?
Me pregunto si es posible hacer algo como:
iris %>%
mutate(sumVar = colsum_function(Sepal.Length:Petal.Width))
Agregar el comentario de @ docendodiscimus como respuesta. ¡+1 a él!
iris %>% mutate(sumVar = rowSums(select(., contains("Sepal"))))
Esto es más una solución alternativa pero podría usarse
iris %>% mutate(sumVar = rowSums(.[1:4]))
Como está escrito en los comentarios, también puede usar una
select
dentro de mutate para obtener las columnas que desea resumir, por ejemplo
iris %>%
mutate(sumVar = rowSums(select(., contains("Sepal")))) %>%
head
o
iris %>%
mutate(sumVar = select(., contains("Sepal")) %>% rowSums()) %>%
head
Estoy usando esta solución simple, que es una modificación más robusta de la respuesta de Davide Passaretti:
iris %>% select(Sepal.Length:Petal.Width) %>%
transmute(sumVar = rowSums(.)) %>% bind_cols(iris, .)
(Pero requiere un orden de filas definido, que debería estar bien, a menos que trabaje con conjuntos de datos remotos, tal vez ...)
También puede usar un grep en lugar de
contains
o
matches
, en caso de que necesite ser sofisticado con las expresiones regulares (las
matches
no se parecen mucho a las miradas negativas y similares en mi experiencia).
iris %>% mutate(sumVar = rowSums(select(., grep("Sepal", names(.)))))
Una forma más complicada sería:
iris %>% select(Sepal.Length:Petal.Width) %>%
mutate(sumVar = rowSums(.)) %>% left_join(iris)