根据其他列表元素,使用lapply()在列表数据帧中添加新列

时间:2018-11-12 09:51:30

标签: r lapply

我有一个数据帧列表,其中所有元素都有简短的索引名。我正在尝试根据包含索引(键)和实名(名称)的列表中的索引数据框,向包含其实名的某些数据框添加新列。

我实际上认为这是一个非常简单的任务,直到我对代码的赋值部分的索引进行介绍性麻烦,如下所示:

# sample data
data_list <- list(data.frame(names=c("iris", "TootgGrowth", "airquality"), key=c("name01", "name02", "name03")),
                  iris, ToothGrowth, airquality)
names(data_list) <- c("index", "name01", "name02", "name03")

# adding a new column to selected list-dataframes
data_list[names(data_list) != "index"] <-
  lapply(names(data_list)[names(data_list) != "index"],
       function(x){data_list[x]$new_col <- data_list$index$names[data_list$index$key == x]})

data_list$index$names[data_list$index$key == x]部分为我提供了我想要分配的正确值,但是我仍然不知道如何在data_list[x]$new_col <-部分中正确索引,以便分配有效。我还尝试使用assign(paste0("data_list$", x, "$new_col"), ...),但显然也行不通。

谢谢您的建议!

1 个答案:

答案 0 :(得分:2)

您可以尝试类似

lapply(names(data_list), function(x) {
   if (x != "index")
     cbind(data_list[[x]],new_col = data_list$index$names[data_list$index$key == x])
   else
     data_list[[x]]
})

如果列表元素的name是“索引”,那么我们将按原样返回数据框,如果不是,则将new_col添加到具有其名称的数据框。