r:lapply但具有动态命名

时间:2017-01-20 16:00:56

标签: r list lapply

假设我在列表中有5个数据集(每个数据集名为df_1df_2,依此类推),每个数据集都有一个名为cons的变量。我希望在列表中的每个数据集中执行cons以上的函数,并创建一个名称具有相应数据集后缀的新变量。

所以最后df_1会有一个名为cons_1的变量,而df_2会有一个名为cons_2的变量。我遇到的问题是变量循环并尝试创建动态名称。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

这实际上非常简单:

df_names <- paste("df", 1:5, sep = "_")
cons_names <- paste("cons", 1:5, sep = "_")

for (i in 1:5) {
  # get the df from the current env by name
  df_i <- get(df_names[i])
  # do whatever you need to do and assign the result
  df_i[[cons_names[i]]] <- some_operation(df_i)
}

但是将数据框保留在列表中以避免使用get会更有意义,这可能是粗略的:

for (i in 1:5) {
  df_i[[cons_names[i]]] <- some_operation(df_list[[i]])
}

答案 1 :(得分:0)

使用purrr软件包,这将是一种替代解决方案:

library(purrr)
lst <- list(mtcars_1 = mtcars,
            mtcars_2 = mtcars,
            mtcars_3 = mtcars,
            mtcars_4 = mtcars,
            mtcars_5 = mtcars)

map(seq_along(lst), function(x) {
lst[[x]][paste0("mpg_", x)] <- some_operation(lst[[x]]['mpg']); lst[[x]]
})

从列表中设置每个数据框的子集,使用当前数据框的索引创建新的mpg变量,并对mpg变量执行所需的任何操作。结果是一个列表,其中包含所有数据的先前数据帧以及每个数据帧的新变量。

由于此新列表没有数据框名称,因此您始终可以使用setNames(newlist, names(lst))

添加它们