【问题标题】:Convert object name to string in tidyverse chain within anonymous function在匿名函数中将对象名称转换为 tidyverse 链中的字符串
【发布时间】:2020-01-11 00:10:34
【问题描述】:

我正在尝试将对象名称转换为匿名函数中的字符串。首先,我需要在 dplyr 链中正常调用对象,然后使用对象的名称。

我尝试了多种方法来解决我的问题,但我不确定它们为什么不起作用。我在直接调用对象时成功了,但不是在 map/lapply 链中的函数内。

我检查了以下三个页面: In R, how to get an object's name after it is sent to a function?

How to convert variable (object) name into String

converting a quosure to a string in 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"

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    我们可以在named list 上使用imap(如果我们用lst 包装,我们会得到,用str_removepaste(或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+"))
    

    关于为什么quo() 不起作用,它把它当作文字'x'。而不是存储在其中的值

    stringr::str_sub(rlang::quo_text(quo(x)), -2)
    #[1] "x"
    

    【讨论】:

    • 成功了!谢谢。一个问题,stringr 调用中的“\\D+”是什么?
    • @hmhensen 那只是删除所有非数字值(即一个或多个字符而不是数字)。如果你只有。 'a',然后简单地str_remove(.y, "a")
    • @hmhensen。我会使用imapmap2(也传递名称)而不是应用大量评估(因为这些已经针对此类操作进行了优化)
    • 这是下一步。我正在尝试将map2 纳入我的更多工作中,但我不会经常遇到这些情况。
    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多