Реализовать lapply вместе с функцией get () для векторизации объединения таблиц данных?р - PullRequest
0 голосов
/ 27 ноября 2018

Вопрос: Как реализовать функцию lapply в сочетании с функцией get () для объединения списка таблиц данных?

Цель: Для каждого из элементов в имя_тикера объединить таблицу данных с именем "dt_q_'ticker_name [i] '" иназывается "meta_'ticker_name [i] '" по общей переменной "id":

ticker_name <- c("CTNP", "PB", "SD", "PC", "PE", "TY", "XD") 
for (i in 1:length(ticker_name)) {

  dt <- get(paste0("dt_q_", ticker_name[i]))
  meta <- get(paste0("meta_", ticker_name[i]))
  dt <- merge(x = dt, y = meta, by= c("id"))
  head(dt)
}

Моя неработающая попытка с lapply:

lapply(
  X = ticker_name,
  FUN = 
    merge(x = get(paste0("dt_q_", ticker_name)),
          y = get(paste0("meta_", ticker_name)), by = c("id")
             ))

сообщение об ошибке:

 Error in match.fun(FUN) : 
 c("'merge(x = get(paste0(\"dt_q_\", ticker_name)),
 y = get(paste0(\"meta_\", ' is not a function,
 character or symbol", "'    ticker_name)), by = c(\"id\"))'
 is not a function, character or symbol")

1 Ответ

0 голосов
/ 27 ноября 2018

Мы можем использовать mget, чтобы вернуть все объекты в list, и в качестве соответствующего data.table должно быть merge d, использовать Map, который может иметь несколько аргументов

Map(merge, mget(paste0("dt_q_", ticker_name)), 
    mget(paste0("meta_", ticker_name)),
        MoreArgs =  list(by = 'id'))
* 1007.*

Или используя lapply, переберите 'ticker_name', затем paste соответствующую часть 'prefix', get значения строковых объектов и merge

lapply(ticker_name, function(x) merge(get(paste0("dt_q_", x)), 
      get(paste0("meta_", x)), by = 'id'))

ПРИМЕЧАНИЕ: В коде OP после циклического перебора 'ticker_name' (или ticker_list - не ясно), он paste префикс с целым 'ticker_name', что не так, если мы проверяем цикл for, гдеон проходит по последовательности 'имя_текста'.Мы также можем перебрать последовательность

lapply(seq_along(ticker_name), function(i) {
  dt <- get(paste0("dt_q_", ticker_name[i]))
  meta <- get(paste0("meta_", ticker_name[i]))
  merge(x = dt, y = meta, by= "id")

     })
...