usar studio sheet mutate meaning functions como cheat r dplyr

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)