Я могу использовать tidyr::complete
для отображения пропущенных строк.
Например, с помощью следующего data.frame я могу легко представить пропущенный третий квартал:
suppressPackageStartupMessages({
library(dplyr)
library(tidyr)
})
set.seed(42)
df <- data.frame(
id = c(rep(1, 3), rep(2, 3)),
year = rep(2020, 3),
quarter = c(1, 2, 4),
data = runif(3)
)
df %>% complete(nesting(id, year), quarter = 1:4)
#> # A tibble: 8 x 4
#> id year quarter data
#> <dbl> <dbl> <dbl> <dbl>
#> 1 1 2020 1 0.915
#> 2 1 2020 2 0.937
#> 3 1 2020 3 NA
#> 4 1 2020 4 0.286
#> 5 2 2020 1 0.915
#> 6 2 2020 2 0.937
#> 7 2 2020 3 NA
#> 8 2 2020 4 0.286
Создано в 2020-03-02 пакетом Представления (v0.3.0)
Теперь я хочу создать оболочку для этого конкретного c варианта использования: он принимает в data.frame как минимум эти четыре столбца и выставляет пропущенные четверти.
Это достаточно просто, просто оберните вызов complete
в функцию:
expose <- function(df) {
complete(df, nesting(id, year), quarter = 1:4)
}
expose(df)
#> # A tibble: 8 x 4
#> id year quarter data
#> <dbl> <dbl> <dbl> <dbl>
#> 1 1 2020 1 0.915
#> 2 1 2020 2 0.937
#> 3 1 2020 3 NA
#> 4 1 2020 4 0.286
#> 5 2 2020 1 0.915
#> 6 2 2020 2 0.937
#> 7 2 2020 3 NA
#> 8 2 2020 4 0.286
Однако входящий data.frame может иметь другие столбцы, которые, как известно, являются постоянными для данного id
. В этом случае функция не работает, так как она естественным образом устанавливает для этих столбцов значение NA
в пропущенных строках.
df <- data.frame(
id = c(rep(1, 3), rep(2, 3)),
name = c(rep("A", 3), rep("B", 3)),
country = c(rep("AU", 3), rep("BR", 3)),
year = rep(2020, 3),
quarter = c(1, 2, 4),
data = runif(3)
)
expose(df)
#> # A tibble: 8 x 6
#> id year quarter name country data
#> <dbl> <dbl> <dbl> <fct> <fct> <dbl>
#> 1 1 2020 1 A AU 0.830
#> 2 1 2020 2 A AU 0.642
#> 3 1 2020 3 <NA> <NA> NA
#> 4 1 2020 4 A AU 0.519
#> 5 2 2020 1 B BR 0.830
#> 6 2 2020 2 B BR 0.642
#> 7 2 2020 3 <NA> <NA> NA
#> 8 2 2020 4 B BR 0.519
Чтобы избежать этого, мне нужно добавить эти столбцы в nesting
call.
Если бы это был только один столбец, я мог бы добавить в функцию аргумент для имени столбца, который я бы затем использовал с nesting(..., .data[[colname]])
. Однако местоимение .data
не работает с векторами (.data[c("name1", "name2")]
не работает).
Итак, как я могу добавить несколько переменных столбцов к вызову nesting
?