Я думаю, что это сложно, потому что варианты видоизменения mutate (mutate_at
, mutate_all
, mutate_if
) обычно нацелены на выполнение функции в определенном столбце, а не на создание операции, которая использует все столбцы.
Самое простое решение, которое я могу придумать, состоит в основном в создании вектора (cols
), который затем используется для выполнения сводной операции:
library(dplyr)
library(purrr)
df_1 <- data.frame(
x = replicate(4, runif(30, 20, 100)),
y = sample(1:3, 30, replace = TRUE)
)
# create vector of columns to operate on
cols <- names(df_1)
cols <- cols[map_lgl(df_1, is.numeric)]
cols <- cols[! cols %in% c("y")]
cols
#> [1] "x.1" "x.2" "x.3" "x.4"
df_1 %>%
select(-y) %>%
rowwise() %>%
mutate(
var = sum(!!!map(cols, as.name), na.rm = TRUE)
)
#> Source: local data frame [30 x 5]
#> Groups: <by row>
#>
#> # A tibble: 30 x 5
#> x.1 x.2 x.3 x.4 var
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 46.1 28.9 28.9 50.7 155.
#> 2 26.8 68.0 67.1 26.5 188.
#> 3 35.2 63.8 62.5 28.5 190.
#> 4 31.3 44.9 67.3 68.2 212.
#> 5 52.6 23.9 83.2 43.4 203.
#> 6 55.7 92.8 86.3 57.2 292.
#> 7 56.9 50.0 77.6 25.6 210.
#> 8 95.0 82.6 86.1 22.7 286.
#> 9 62.7 26.5 61.0 88.9 239.
#> 10 65.2 23.1 25.5 51.0 165.
#> # … with 20 more rows
Создано в 2019-04-30 представьте пакет (v0.2.1)
ПРИМЕЧАНИЕ: если вы не знакомы с purrr
, вы также можете использовать что-то вроде lapply
и т. Д.
Подробнее об этих более сложных dplyr
операциях (!!
, !!!
и т. Д.) Можно узнать здесь:
https://dplyr.tidyverse.org/articles/programming.html