Преобразовать имя объекта в строку в цепочке Tidyverse внутри анонимной функции - PullRequest
1 голос
/ 11 января 2020

Я пытаюсь преобразовать имя объекта в строку внутри анонимной функции. Во-первых, мне нужно вызвать объект обычно в цепочке dplyr, затем использовать имя объекта.

Я пробовал несколько методов, чтобы решить мою проблему, но я не уверен, почему они не работают. Мне удалось при непосредственном вызове объекта, но не внутри функции в цепочке map / lapply.

Я проверил три следующие страницы: В R, как получить имя объекта после оно отправляется в функцию?

Как преобразовать имя переменной (объекта) в строку

, преобразовав выражение в строку в R

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

Данные (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"

1 Ответ

1 голос
/ 11 января 2020

Мы можем использовать imap на named list (который мы получим, если обернем с lst, удалим нечисловую c часть с 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+"))

Относительно того, почему quo() не работает, он принимает это как литерал 'x' вместо значения, хранящегося в нем

stringr::str_sub(rlang::quo_text(quo(x)), -2)
#[1] "x"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...