假设我在列表中有5个数据集(每个数据集名为df_1
,df_2
,依此类推),每个数据集都有一个名为cons
的变量。我希望在列表中的每个数据集中执行cons
以上的函数,并创建一个名称具有相应数据集后缀的新变量。
所以最后df_1
会有一个名为cons_1
的变量,而df_2
会有一个名为cons_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))