dplyr `cross ()` функция требует `rowwise ()` функция yes? - PullRequest
1 голос
/ 04 мая 2020
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. И мы определим «работать» как «делать то, что я хочу».

1 Ответ

2 голосов
/ 04 мая 2020

У вас нет части rowwise. Помните, что c_across действителен только для операций со строками (это то, что вы хотите прямо сейчас).

mtcars %>% 
    select(drat, wt) %>% 
    rowwise() %>% 
    mutate(max = max(c_across(drat:wt), na.rm = TRUE))

# A tibble: 32 x 3
# Rowwise: 
    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
...