Условно добавить фреймы данных к определенным уровням вложенного списка - PullRequest
0 голосов
/ 15 октября 2018

У меня есть вложенный список (mylist), и я хотел бы автоматически cbind фрейм данных (colors) перейти к списку более низкого уровня (iris), только если имя списка содержит определенныйстрока (iris), но я сталкиваюсь с несколькими ошибками.

Пример:

mylist <- list(favorites=list("iris"=iris[1:5,], "mtcars"=mtcars[1:5,], "ToothGrowth"=ToothGrowth[1:5,]), misc = list("air"=airquality))
colors <- data.frame(dark = "black", light = "white", mid = "violet")

Я хотел бы добавить colors только во вложенный список, iris, по существу: cbind(mylist$favorites$iris, colors).Мой реальный набор данных намного больше, и ручное использование cbind в каждом вложенном списке невозможно.

Так, что:

> cbind.fill(mylist$favoritres$iris, colors)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species  dark light    mid
1          5.1         3.5          1.4         0.2  setosa black white violet
2          4.9         3.0          1.4         0.2  setosa black white violet
3          4.7         3.2          1.3         0.2  setosa black white violet
4          4.6         3.1          1.5         0.2  setosa black white violet
5          5.0         3.6          1.4         0.2  setosa black white violet

Моя текущая попытка решения:

mylist <- lapply(mylist, function(x) {
    if(grepl("iris", x$favorites)==TRUE){
        x$favorites <- lapply(x$favorites, function(y) cbind(y, colors))
        }; x
    })

Что выдает ошибку:

Ошибка в if (grepl ("iris", x $ Favorites) == TRUE) {: аргумент имеет нулевую длину

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вот рекурсивное решение, которое найдет «ирис» независимо от того, насколько глубоко оно вложено в ваш список:

library(rowr)

bind_search <- function(the_list, the_df, matching_name) {

  for (n in names(the_list)) {

    if (n == matching_name && is.data.frame(the_list[[n]])) {
      the_list[[n]] <- cbind.fill(the_list[[n]], the_df)
      return(the_list)
    }

    the_list[[n]] <- bind_search(the_list[[n]], the_df, matching_name)
    return(the_list)
  }
}

mylist2 <- bind_search(mylist, colors, 'iris')
0 голосов
/ 15 октября 2018

Мы могли бы создать логическое условие для добавления

library(rowr)
mylist2 <- lapply(mylist, function(x)  {
       i1 <- names(x) == "iris"
        x[i1] <- lapply(x[i1], function(y) cbind.fill(y, colors))
        x
   })
...