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? Как я могу получить длину фрейма данных в той части канала, где она мне нужна? Я никогда не узнаю, сколько столбцов осталось до конца, и фактические имена не так чисты, как мой примерный фрейм данных.