Генерация и передача вектора 30 лет с обратным отсчетом в функцию, которая использует NSE (dplyr) - PullRequest
0 голосов
/ 10 сентября 2018

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

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Требуемая функция rlang - это rlang::sym() (и ее векторизованная версия rlang::syms()), которая преобразует строки в символы с обратным символом.

rlang::syms( as.character(1997:2001) ) %>% map( ~f(tbl = df, year = !!.x) )
# [[1]]
# # A tibble: 2 x 3
# # Groups:   CELL_ID [2]
#   CELL_ID `1997`     n
#     <dbl>  <dbl> <int>
# 1  170318      1     2
# 2  174625      1     1
# 
# [[2]]
# # A tibble: 2 x 3
# # Groups:   CELL_ID [2]
#   CELL_ID `1998`     n
#     <dbl>  <dbl> <int>
# 1  170318      1     1
# 2  174625      1     1
# 
# [[3]]
# # A tibble: 1 x 3
# # Groups:   CELL_ID [1]
#   CELL_ID `1999`     n
#     <dbl>  <dbl> <int>
# 1  170318      1     2
# 
# ...

Обратите внимание, что map_dfc не будет работать, потому что ваши результирующие кадры данных имеют разное количество строк.

0 голосов
/ 04 ноября 2018

Как уже упоминалось, просто измените ваш широкий фрейм данных на длинные, используя tidy::gather, который может принимать имена с обратными запятыми, даже с диапазонами.

library(dplyr)
library(tidyr)

long_df <- df %>% 
  gather(key="year", value="value", `1997`:`2001`) %>%
  filter(value > 0)

long_df
# # A tibble: 10 x 4
#    Asset         CELL_ID year  value
#    <chr>           <dbl> <chr> <dbl>
#  1 048 (NC4), LY 174625. 1997     1.
#  2 059-3D, LY    170318. 1997     1.
#  3 059-5F, LY    170318. 1997     1.
#  4 048 (NC4), LY 174625. 1998     1.
#  5 059-5F, LY    170318. 1998     1.
#  6 059-3D, LY    170318. 1999     1.
#  7 059-5F, LY    170318. 1999     1.
#  8 059-5F, LY    170318. 2000     1.
#  9 048 (NC4), LY 174625. 2001     1.
# 10 059-3D, LY    170318. 2001     1.

Затем используйте base::split в year столбец для вашего именованного списка фреймов данных.

tibble_list <- split(long_df, long_df$year)

tibble_list 
# $`1997`
# # A tibble: 3 x 4
#   Asset         CELL_ID year  value
#   <chr>           <dbl> <chr> <dbl>
# 1 048 (NC4), LY 174625. 1997     1.
# 2 059-3D, LY    170318. 1997     1.
# 3 059-5F, LY    170318. 1997     1.

# $`1998`
# # A tibble: 2 x 4
#   Asset         CELL_ID year  value
#   <chr>           <dbl> <chr> <dbl>
# 1 048 (NC4), LY 174625. 1998     1.
# 2 059-5F, LY    170318. 1998     1.

# $`1999`
# # A tibble: 2 x 4
#   Asset      CELL_ID year  value
#   <chr>        <dbl> <chr> <dbl>
# 1 059-3D, LY 170318. 1999     1.
# 2 059-5F, LY 170318. 1999     1.

# $`2000`
# # A tibble: 1 x 4
#   Asset      CELL_ID year  value
#   <chr>        <dbl> <chr> <dbl>
# 1 059-5F, LY 170318. 2000     1.

# $`2001`
# # A tibble: 2 x 4
#   Asset         CELL_ID year  value
#   <chr>           <dbl> <chr> <dbl>
# 1 048 (NC4), LY 174625. 2001     1.
# 2 059-3D, LY    170318. 2001     1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...