У меня есть функция ниже, которая принимает фрейм данных и год для фильтрации. Я хочу выполнить эту функцию, чтобы возвращать фреймы данных за каждый год с 1997 по 2017 год, а затем я хочу сохранить все 30 фреймов в одном списке. Как пройти все годы, когда имена моих переменных - это числа с обратными числами, такие как `2012`,` 2013` и т. Д .?
Я знаю, что должен использовать какой-то вариант функций lapply
или purrr::map
, чтобы получить список, но как я могу передать что-то вроде вектора 1997:2017
, но в форме выражений в кавычках?
# Data frame, condensed just to years 1997 to 2001 for sample code.
df <- tibble(Asset = c("048 (NC4), LY", "059-3D, LY", "059-5F, LY"),
`1997` = c(1, 1, 1), `1998` = c(1, 0, 1), `1999` = c(0, 1, 1),
`2000` = c(0, 0, 1), `2001` = c(1, 1, 0), CELL_ID = c(174625, 170318, 170318))
# Returns dataframe with counts for single year
f <- function (tbl, year) {
year <- enquo(year)
tbl %>% as_tibble() %>% group_by(CELL_ID) %>% filter(!!year == 1) %>%
count(!!year) %>% arrange(desc(n))
# function returns a table with counts by cell
}
> f(df, `2001`)
#> A tibble: 2 x 3
#> Groups: CELL_ID [2]
#> CELL_ID `2001` n
#> <dbl> <dbl> <int>
#> 1 170318 1 1
#> 2 174625 1 1
Что я хочу, псевдокод:
# I've written the purrr::map call incorrectly here,
# but here's essentially the structure for how I want to run the
# function across years and return a list of dataframes for every year:
df %>% map_dfc(~ f(tbl = .x, year = list(`1997`, `1998`)))
# ^replaced w vec, or `1997`, `1998`, ... `2017`
# Assuming I fix the above call's syntax, the function I need most:
yearVec <- generateBacktickVector(1997:2017)
df %>% map_dfc(~ f(tbl = .x, year = yearVec))