Вычислить столбцы из имен объектов, которые являются годами - PullRequest
0 голосов
/ 10 января 2019

У меня есть эти данные:

library(tidyverse)    
df <- tibble(year = c(2018L, 2019L, 2020L, 2021L, 2022L, 2023L, 2024L, 2018L, 2019L,
                           2020L, 2021L, 2022L, 2023L, 2024L),
                number = c(1000L, 2000L, 3000L, 4000L, 5000L, 6000L, 7000L, 1000L, 1100L,
                           1200L, 1300L, 1400L, 1500L, 1600L),
                  area = c("a", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b",
                           "b", "b"))

    year_a <- 2019
    year_b <- 2022

Что я преобразовал в это:

df2 <- df  %>% 
  filter(year %in% c(year_a, year_b)) %>% 
  spread(year, number) 

Что это:

# A tibble: 2 x 3
  area  `2019` `2022`
  <chr>  <int>  <int>
1 a       2000   5000
2 b       1100   1400

Я хочу иметь возможность рассчитать разницу между year_b (2022) и year_a (2019) без необходимости вводить эти числа, так как годы будут меняться и указываться в объектах.

Я пробовал это:

year_a_chr <- paste0("`", year_a, "`", sep = "")
year_b_chr <- paste0("`", year_b, "`", sep = "")

df2 %>% 
  mutate(growth = !!year_b_chr - !!year_a_chr)

Что дает мне эту ошибку:

Ошибка в mutate_impl (.data, точки): Ошибка оценки: неверный тип аргумента.

Как бы я решил это? Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Если вы не возражаете против небольшого дополнительного шага, вы можете составить таблицу поиска по годам с их метками (т. Е. "Year_a"). Таким образом, вы можете присоединиться к своей таблице, а затем использовать эти метки для имен столбцов после распространения данных. Он также может легче масштабироваться, например, если вам нужно расширить набор лет, с которыми вы работаете.

library(tidyverse)    

year_a <- 2019
year_b <- 2022

Вы можете создать справочную таблицу вручную, например:

# manually
tibble(
  key = c("year_a", "year_b"),
  year = c(year_a, year_b)
)
#> # A tibble: 2 x 2
#>   key     year
#>   <chr>  <dbl>
#> 1 year_a  2019
#> 2 year_b  2022

Или программно, используя tibble::lst как быстрый способ включения имен переменных года.

year_lookup <- lst(year_a, year_b) %>% 
  as_tibble() %>% 
  gather(key, value = year)

Затем вместо фильтрации используйте внутреннее соединение, чтобы сохранить только те значения, которые появляются в поиске, и получить их метки.

df2 <- df %>%
  inner_join(year_lookup, by = "year") %>%
  select(-year) %>%
  spread(key = key, value = number)

df2
#> # A tibble: 2 x 3
#>   area  year_a year_b
#>   <chr>  <int>  <int>
#> 1 a       2000   5000
#> 2 b       1100   1400

После этого у вас есть способ выполнить вычисления, указав столбцы, например year_b вместо номера года.

df2 %>%
  mutate(diff = year_b - year_a)
#> # A tibble: 2 x 4
#>   area  year_a year_b  diff
#>   <chr>  <int>  <int> <int>
#> 1 a       2000   5000  3000
#> 2 b       1100   1400   300

Создано в 2019-01-09 пакетом Представить (v0.2.1)

0 голосов
/ 10 января 2019

Мы конвертируем объекты в символы и оцениваем (!!)

library(dplyr)
df2 %>% 
    mutate(growth = !! rlang::sym(paste0(year_b)) - !! rlang::sym(paste0(year_a)))
# A tibble: 2 x 4
#  area  `2019` `2022` growth
#  <chr>  <int>  <int>  <int>
#1 a       2000   5000   3000
#2 b       1100   1400    300
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...