Добавьте некоторую строку ко всем элементам большого (16Mill) списка (может возникнуть вопрос о применении синтаксиса) - PullRequest
3 голосов
/ 06 октября 2019

Я пытаюсь получить что-то похожее на это:

mylist <- list(c("a"), c("a", "b"), c("a","b","c"))

во что-то похожее на это:

list(c("y ~ a"), c("y ~ a + b"), c("y ~ a + b + c"))

для одного элемента, я могу сделать это:

test <- paste0("y ~ ", paste0(mylist[[3]], collapse = " + "))  
test
[1] "y ~ a + b + c"

поэтому я подумал, что попробую использовать заявку, и это тоже работает:

mylistupdater <- function(X){
mylist[[X]] <- paste0("y ~ ", paste0(mylist[[X]], collapse = " + "))  
}
lapply(c(1:length(mylist)), mylistupdater)

проблема в том, что мой реальный список содержит 16 миллионов записей, и это такчтобы замедлитьЯ думаю, что пишу функцию apply очень плохо, как цикл. Он должен адресоваться не к индексу, а к списку напрямую, верно? Но примеры, которые я вижу в Интернете, включают в себя простую функцию. Как я могу передать аргументы этому с этими двумя paste0() командами и с уборщиком lapply()? Или есть решение data.table? Выходные данные вполне могут быть столбцом в data.table. Скорость на самом деле важна на этот раз.

edit: @akrun и @Rui дают отличные ответы ниже, которые решают мою проблему. Теперь у меня есть роскошь думать о скорости, и вот скачка, повторяющая каждый из ответов 100 000 раз на моей машине:

версия с mylistupdater(mylist): разница во времени 1,072506 с

версия с lapply(mylist, reformulate, response = "y"): разница во времени 10,5461 с

версия с lapply(mylist, function(x) format(reformulate(x, "y"))): разница времени 18,20975 с

Ответы [ 2 ]

3 голосов
/ 06 октября 2019

Мы можем использовать reformulate

lapply(mylist, reformulate, response = "y")

Если это должна быть строка

lapply(mylist, function(x) format(reformulate(x, "y")))
#[[1]]
#[1] "y ~ a"

#[[2]]
#[1] "y ~ a + b"

#[[3]]
#[1] "y ~ a + b + c"
3 голосов
/ 06 октября 2019

A lapply звоните, делайте то, что просит вопрос. Затем присвойте результат обратно списку регрессоров или списку результатов.

mylistupdater <- function(X, response = "y"){
  lapply(X, function(x) {
    x <- paste(x, collapse = " + ")
    paste(response, x, sep = " ~ ")
  })
}

mylistupdater(mylist)
#[[1]]
#[1] "y ~ a"
#
#[[2]]
#[1] "y ~ a + b"
#
#[[3]]
#[1] "y ~ a + b + c"
...