我有一个嵌套列表(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)中的错误{ 参数的长度为零
答案 0 :(得分:2)
我们可以创建一个逻辑条件来添加
library(rowr)
mylist2 <- lapply(mylist, function(x) {
i1 <- names(x) == "iris"
x[i1] <- lapply(x[i1], function(y) cbind.fill(y, colors))
x
})
答案 1 :(得分:1)
这是一个递归解决方案,无论嵌套在列表中的深度如何,它都会找到“ iris”:
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')