dplyr `cross ()` функция и длина фрейма данных при группировке - PullRequest
1 голос
/ 01 мая 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)
df <- tibble(Date = c(rep(as.Date("2020-01-01"), 3), 
                      rep(as.Date("2020-02-01"), 2)),
             Type = c("A", "A", "B", "C", "C"),
             col1 = 1:5,
             col2 = c(0, 8, 0, 3, 0),
             col3 = c(25:29),
             colX = rep(99, 5))
#> # A tibble: 5 x 6
#>   Date       Type   col1  col2  col3  colX
#>   <date>     <chr> <int> <dbl> <int> <dbl>
#> 1 2020-01-01 A         1     0    25    99
#> 2 2020-01-01 A         2     8    26    99
#> 3 2020-01-01 B         3     0    27    99
#> 4 2020-02-01 C         4     3    28    99
#> 5 2020-02-01 C         5     0    29    99

Я бы хотел суммировать столбцы с 1 по X выше по строкам, сгруппированные по «Дата» и «Тип». Я всегда буду начинать с третьего столбца (ie col1), но никогда не узнаю числовое значение X в colX. Это нормально, потому что я могу использовать длину фрейма данных, чтобы определить, как далеко мне нужно go 'out' , чтобы захватить все столбцы до конца фрейма данных. Вот мой подход:

df %>% 
  group_by(Date, Type) %>% 
  summarize(across(3:length(.)), sum())
#> Error: Problem with `summarise()` input `..1`.
#> x Can't subset columns that don't exist.
#> x Locations 5 and 6 don't exist.
#> i There are only 4 columns.
#> i Input `..1` is `across(3:length(.))`.
#> i The error occured in group 1: Date = 2020-01-01, Type = "A".
#> Run `rlang::last_error()` to see where the error occurred.

Но, похоже, мое использование базовой функции R length(.) является неправильным. Правильно ли я использую новую функцию across() dplyr? Как я могу получить длину фрейма данных в той части канала, где она мне нужна? Я никогда не узнаю, сколько столбцов осталось до конца, и фактические имена не так чисты, как мой примерный фрейм данных.

1 Ответ

2 голосов
/ 01 мая 2020
packageVersion("dplyr")
#[1] ‘0.8.99.9002’

Во-первых, у вас просто небольшая проблема с синтаксисом, оператором select и функцией go внутри вызова across.

df %>% summarize(across(3:length(.),sum))
## A tibble: 1 x 4
#   col1  col2  col3  colX
#  <int> <dbl> <int> <dbl>
#1    15    11   135   495

Следующий код не работает потому что вы не можете выбрать столбцы, которые в настоящее время group_by -ed на.

df %>% 
   group_by(Date, Type) %>% 
   summarize(across(3:length(.), sum))
#Error: Problem with `summarise()` input `..1`.
#x Can't subset columns that don't exist.
#x Locations 5 and 6 don't exist.
#ℹ There are only 4 columns.

Это очевидно, если вы попробуете следующее:

df %>% 
   group_by(Date, Type) %>% 
   summarize(across(everything(), sum))
## A tibble: 3 x 6
## Groups:   Date [2]
#  Date       Type   col1  col2  col3  colX
#  <date>     <chr> <int> <dbl> <int> <dbl>
#1 2020-01-01 A         3     8    51   198
#2 2020-01-01 B         3     0    27    99
#3 2020-02-01 C         9     3    57   198

Другие варианты включают starts_with tidy-select глагол.

df %>% 
  group_by(Date, Type) %>% 
  summarize(across(starts_with("col"), sum))
## A tibble: 3 x 6
## Groups:   Date [2]
#  Date       Type   col1  col2  col3  colX
#  <date>     <chr> <int> <dbl> <int> <dbl>
#1 2020-01-01 A         3     8    51   198
#2 2020-01-01 B         3     0    27    99
#3 2020-02-01 C         9     3    57   198

The по строкам и по столбцам виньетки довольно хороши. Строковый обсуждает, как столбцы group_by являются подмножеством.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...