get () не работает для столбца во фрейме данных в списке в R (фу) - PullRequest
0 голосов
/ 15 января 2019

У меня есть список фреймов данных. Я хочу использовать lapply для определенного столбца для каждого из этих фреймов данных, но я продолжаю выдавать ошибки, когда я пробовал методы из похожих ответов:

Установка выглядит примерно так:

a <- list(*a series of data frames that each have a column named DIM*)
dim_loc <- lapply(1:length(a), function(x){paste0("a[[", x, "]]$DIM")}

В конце концов, я хочу написать что-то вроде results <- lapply(dim_loc, *some function on the DIMs*)

Однако, когда я пытаюсь get(dim_loc[[1]]), скажем, я получаю ошибку: Error in get(dim_loc[[1]]) : object 'a[[1]]$DIM' not found

Но я могу возвращать значения из function(a[[1]]$DIM) весь день. Это там.

Я пытался обойти это, используя as.name () в назначении dim_loc, но, похоже, это тоже не сработало.

Мне любопытно 1. что случилось с get () и 2. если есть лучшее решение. Я ограничиваю себя семейством функций apply, потому что хочу попытаться избавиться от привычки цикла for, и этот метод «имя-как-список», кажется, предпочтительнее, основанный на чем-то вроде R- как динамически называть фреймы данных? , но я бы тоже заинтересовался другими, более элегантными решениями.

1 Ответ

0 голосов
/ 15 января 2019

Я бы сказал, что если вы хотите изменить объект на месте, вам лучше использовать цикл for, поскольку для lapply потребуется символ присваивания <<- (<- не работает на lapply` ). Вот так:

set.seed(1)

aList <- list(cars = mtcars, iris = iris)

for(i in seq_along(aList)){
  aList[[i]][["newcol"]] <- runif(nrow(aList[[i]]))
}

В отличие от ...

invisible(
lapply(seq_along(aList), function(x){
  aList[[x]][["newcol"]] <<- runif(nrow(aList[[x]]))
})
)

Вы должны использовать invisible(), иначе lapply выведет вывод на консоль. <<- назначает вектор runif(...) новому созданному столбцу.

Если вы хотите создать другой набор data.frame с использованием lapply, тогда вы делаете:

lapply(seq_along(aList), function(x){
  aList[[x]][["newcol"]] <- runif(nrow(aList[[x]]))

  return(aList[[x]])
})

Кроме того, могу ли я предложить использовать seq_along(list) в lapply и for петлях в отличие от 1:length(list), поскольку это позволяет избежать неожиданного поведения, такого как:

# no length list
seq_along(list()) # prints integer(0)
1:length(list()) # prints 1 0. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...