R 根据以年为单位的对象名称计算列

R 根据以年为单位的对象名称计算列,r,object,dplyr,R,Object,Dplyr,我有以下数据: 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,

我有以下数据:

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
库(tidyverse)

df我们将对象转换为符号并计算(
!!

库(dplyr)
df2%>%
突变(生长=!!rlang::sym(第0年(第b年))-!!rlang::sym(第0年(第a年)))
#一个tibble:2x4
#区域'2019'`2022'增长
#        
#1 a 2000 5000 3000
#2B 1100 1400 300

如果您不介意多做一小步,您可以用年份标签(即“year_a”)制作一个年份查找表。这样,您就可以连接到表中,然后在分散数据后使用这些标签作为列名。它也可能更容易扩展,例如如果你需要扩展你工作的年限

库(tidyverse)
今年是关键的一年
#>     
#>2019年1年
#>2022年2年
或者通过编程,使用
tibble::lst
作为包含年份变量名称的快速方法

year\u查找%
as_tible()%>%
聚集(键,值=年)
然后,使用内部联接而不是过滤,只保留查找中显示的值,并获取它们的标签

df2%
内部联接(年查找,按=“年”)%>%
选择(-year)%>%
排列(键=键,值=数)
df2
#>#tibble:2 x 3
#>地区年份
#>       
#>1 a 2000 5000
#>2 b 1100 1400
之后,您可以通过指向诸如
year\b
之类的列而不是年号来进行计算

df2%>%
变异(差异=年份b-年份a)
#>#A tibble:2 x 4
#>地区年份
#>        
#>1 a 2000 5000 3000
#>2B 1100 1400 300

由(v0.2.1)

于2019-01-09创建,我假设它们被称为对象。如果我错了,请纠正我。我只是好奇,还有什么其他方法可以做到这一点?可能正在使用
get
eval
?@YOLO您可以使用
get
来获取值,
df2%>%mutate(growth=get(paste0(year_b))
或转换为symbol
df2%>%mutate(growth=eval(as.symbol(paste0(year_b)))
,但在开发这些软件包时不推荐使用
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_a_chr <- paste0("`", year_a, "`", sep = "")
year_b_chr <- paste0("`", year_b, "`", sep = "")

df2 %>% 
  mutate(growth = !!year_b_chr - !!year_a_chr)
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