packageVersion("dplyr")
#[1] ‘0.8.99.9002’
Обратите внимание , что этот вопрос использует новую функцию dplyr across()
. Чтобы установить последнюю версию dev для dplyr, введите команду remotes::install_github("tidyverse/dplyr")
. Чтобы восстановить выпущенную версию dplyr, введите команду install.packages("dplyr")
. Если вы читаете эту статью в будущем и уже пользуетесь dplyr 1.X +, вам не нужно беспокоиться об этой заметке.
library(tidyverse)
WorldPhones %>%
as.data.frame() %>%
rowwise() %>%
mutate(mean = mean(c_across(N.Amer:Mid.Amer), na.rm = TRUE))
#> # A tibble: 7 x 8
#> # Rowwise:
#> N.Amer Europe Asia S.Amer Oceania Africa Mid.Amer mean
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 45939 21574 2876 1815 1646 89 555 10642
#> 2 60423 29990 4708 2568 2366 1411 733 14600.
#> 3 64721 32510 5230 2695 2526 1546 773 15714.
#> 4 68484 35218 6662 2845 2691 1663 836 16914.
#> 5 71799 37598 6856 3000 2868 1769 911 17829.
#> 6 76036 40341 8220 3145 3054 1905 1008 19101.
#> 7 79831 43173 9053 3338 3224 2005 1076 20243.
Эта статья доктора Кейта МакНалти хороший пример (показанный выше) работы с новой функцией dplyr c_across()
. Вы go в каждой строке и R вычисляет среднее значение между выбранными столбцами.
Давайте сделаем то же самое с фреймом данных mtcars, вместо этого выбрав максимальное значение по столбцам для каждой строки. Мы будем выбирать только переменные «drat» и «wt» для простоты.
mtcars %>%
select(drat, wt) %>%
as_tibble() %>%
mutate(max = max(c_across(drat:wt), na.rm = TRUE))
#> # A tibble: 32 x 3
#> drat wt max
#> <dbl> <dbl> <dbl>
#> 1 3.9 2.62 5.42
#> 2 3.9 2.88 5.42
#> 3 3.85 2.32 5.42
#> 4 3.08 3.22 5.42
#> 5 3.15 3.44 5.42
#> 6 2.76 3.46 5.42
#> 7 3.21 3.57 5.42
#> 8 3.69 3.19 5.42
#> 9 3.92 3.15 5.42
#> 10 3.92 3.44 5.42
#> # ... with 22 more rows
Почему dplyr не выбирает максимальное значение для каждой строки и не отображает его в столбце max
? То, что я хочу, выглядело бы так:
#> # A tibble: 32 x 3
#> drat wt max
#> <dbl> <dbl> <dbl>
#> 1 3.9 2.62 3.9
#> 2 3.9 2.88 3.9
#> 3 3.85 2.32 3.85
#> 4 3.08 3.22 3.22
#> 5 3.15 3.44 3.44
#> 6 2.76 3.46 3.46
#> 7 3.21 3.57 3.57
#> 8 3.69 3.19 3.69
#> 9 3.92 3.15 3.92
#> 10 3.92 3.44 3.92
#> # ... with 22 more rows
Как я могу это сделать? c_across
работал на worldphones, но не работает на mtcars. И мы определим «работать» как «делать то, что я хочу».