我正在尝试将对象名称转换为匿名函数中的字符串。首先,我需要在dplyr链中正常调用该对象,然后使用该对象的名称。
我已经尝试了多种方法来解决我的问题,但不确定为什么它们不起作用。直接调用对象而不是在map / lapply链的函数中调用时,我已经成功。
我已经检查了以下三个页面:在R中,如何将对象的名称发送给函数之后?
以下是一些简化的示例工作,以说明我要完成的工作以及到目前为止已经完成的工作。
数据(3个小标题):
a18 <- tibble(x = c(1,2,3),
y = c(1,2,3))
a19 <- tibble(x = c(1,2,3),
y = c(1,2,3))
dat <-
structure(list(ID = c("12327701006", "12327601004", "12327601006",
"12327601008", "12327701008", "12327701009", "12327701010", "12327701011",
"12326201002", "12334201009"), GRP = c("169", "169", "169", "169",
"169", "169", "169", "169", "170", "169"), Stat = c(8.8981219,
4.25978943, 9.17077178, 4.13070278, 9.38120484, 4.32074928, 4.60516953,
4.60194847, 14.23145155, 5.00784539)), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -10L))
尝试
lapply(list(a18, a19),
function(x) (dat %>%
group_by(GRP) %>%
summarize(Stat = sum(Stat)) %>%
ungroup() %>%
mutate(Year = paste0("20", stringr::str_sub(rlang::quo_text(quo(x)), start = -2)))) )
输出量
[[1]]
# A tibble: 2 x 3
GRP Stat Year
<chr> <dbl> <chr>
1 169 54.4 20x
2 170 14.2 20x
[[2]]
# A tibble: 2 x 3
GRP Stat Year
<chr> <dbl> <chr>
1 169 54.4 20x
2 170 14.2 20x
这是我需要的输出。它包括全年,例如“ 2018”而不是“ 20x”。
期望的输出
[[1]]
# A tibble: 2 x 3
GRP Stat Year
<chr> <dbl> <chr>
1 169 54.4 2018
2 170 14.2 2018
[[2]]
# A tibble: 2 x 3
GRP Stat Year
<chr> <dbl> <chr>
1 169 54.4 2019
2 170 14.2 2019
我不明白为什么它不起作用,因为当我在lapply
通话之外执行以下操作时,它会工作,并返回“ 18”而不是“ x”。
stringr::str_sub(rlang::quo_text(quo(a18)), -2)
[1] "18"
我们可以imap
在上使用named
list
(如果用包裹lst
,将得到,用str_remove
和paste
(或str_c
)删除非数字部分,并加上“ 20”
library(dplyr)
library(purrr)
library(stringr)
imap(lst(a18, a19), ~
dat %>%
group_by(GRP) %>%
summarize(Stat = sum(Stat)) %>%
mutate(Year = str_c("20", str_remove(.y, "\\D+"))))
或搭配 str_replace
imap(lst(a18, a19), ~
dat %>%
group_by(GRP) %>%
summarize(Stat = sum(Stat)) %>%
mutate(Year = str_replace(.y, "\\D+", "20")))
#$a18
# A tibble: 2 x 3
# GRP Stat Year
# <chr> <dbl> <chr>
#1 169 54.4 2018
#2 170 14.2 2018
#$a19
# A tibble: 2 x 3
# GRP Stat Year
# <chr> <dbl> <chr>
#1 169 54.4 2019
#2 170 14.2 2019
或者如果我们使用 list
list(a18 = a18, a19= a19)
或另一个选择是 mget
mget(ls(pattern = "^a\\d+"))
关于为什么thequo()
不起作用,将其视为原义'x'。而不是存储在其中的值
stringr::str_sub(rlang::quo_text(quo(x)), -2)
#[1] "x"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句