Как мне преобразовать трибл в список и преобразовать имена функций? - PullRequest
1 голос
/ 28 февраля 2020

У меня есть образец tbl_df, который я создал. Я пытаюсь создать список, который использует столбец list_name для каждого имени списка и заполняет список, чтобы соответствовать моему example_list ниже. Кроме того, я хотел бы преобразовать символьные значения из столбца scrape_func, чтобы сохранить имена актуальных функций в списке. В качестве примера я использовал mean в списке.

Пример tbl_df

example_df <-tibble::tribble(
   ~list_name, ~abbr,        ~id, ~scrape_func,
      "pepsi", "pep", "pepsi_id",       "mean",
       "coke",  "ck",  "coke_id",       "mean",
  "dr_pepper", "drp",    "dr_id",       "mean"
  )

Формат списка, который я ищу:

example_list <- list(
  "pepsi" = list(
    list_name = "pepsi",
    abbr = "pep",
    id = "pepsi_id",
    scrape_func = mean
  ),
  "coke" = list(
    list_name = "coke",
    abbr = "ck",
    id = "coke_id",
    scrape_func = mean
  ),
  "dr_pepper" = list(
    list_name = "dr_pepper",
    abbr = "drp",
    id = "dr_id",
    scrape_func = mean
  )
)

Я надеюсь использовать решение в tidyverse, если это возможно. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Мы можем использовать get, чтобы получить значение функции, и с помощью pmap можно l oop в течение проверки list

library(dplyr)
library(purrr)
out <- example_df %>% 
         mutate(scrape_func = map(scrape_func, get)) %>%
         pmap(c) %>% 
         set_names(example_df$list_name)

с ожидаемым выводом

all.equal(out, example_list)
#[1] TRUE

Или с match.fun

out <- example_df %>% 
         mutate(scrape_func = map(scrape_func, match.fun)) %>%
          pmap(c) %>% 
          set_names(example_df$list_name)
all.equal(out, example_list)
#[1] TRUE

Обновление

Если ОП хотел сохранить как символ, используйте as.symbol или as.name или rlang::sym или rlang::syms

out2 <-  example_df %>%
            mutate(scrape_func = map(scrape_func, as.name)) %>%
            pmap(c) %>% 
            set_names(example_df$list_name)

out2$pepsi$scrape_func
#mean

Мы можем получить значения с match.fun

match.fun(out2$pepsi$scrape_func)
#function (x, ...) 
#UseMethod("mean")
#<bytecode: 0x7ffdc09fef58>
#<environment: namespace:base>
0 голосов
/ 28 февраля 2020

Возможно, что-то вроде этого?

setNames(apply(example_df, 1, as.list), example_df$list_name)
#> $pepsi
#> $pepsi$list_name
#> [1] "pepsi"
#> 
#> $pepsi$abbr
#> [1] "pep"
#> 
#> $pepsi$id
#> [1] "pepsi_id"
#> 
#> $pepsi$scrape_func
#> [1] "mean"
#> 
#> 
#> $coke
#> $coke$list_name
#> [1] "coke"
#> 
#> $coke$abbr
#> [1] "ck"
#> 
#> $coke$id
#> [1] "coke_id"
#> 
#> $coke$scrape_func
#> [1] "mean"
#> 
#> 
#> $dr_pepper
#> $dr_pepper$list_name
#> [1] "dr_pepper"
#> 
#> $dr_pepper$abbr
#> [1] "drp"
#> 
#> $dr_pepper$id
#> [1] "dr_id"
#> 
#> $dr_pepper$scrape_func
#> [1] "mean"

Создано в 2020-02-27 пакетом представитель (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...