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))
或转换为symboldf2%>%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