假设我在R中有一个数据帧列表。
testList <- list(df1, df2, df3)
我想要做的是将一个函数应用于列表中的每个数据框,以修改存储在环境中的数据帧。这是我试图做的伪代码:
>> modify <- function(list.of.dfs){
for (df in list.of.dfs){
df$some.new.variable <- some.new.value
>> df
>> (returns new df with new variable created)
这是一个简单的例子;对于列表中的每个数据帧,数据框现在将具有一个具有某个值的新变量。
我几乎找到了解决方案。基本上,它遍历列表并为每个数据框创建一个字符串命令,然后对其进行评估。但唯一的问题是,当它创建一个命令时,它会传入索引变量的字符串版本,而不是数据框的名称:
modify <- function(data.list, functionName){
for(i in 1:length(data.list)){
command <- paste0(varText(data.list),
"[[",
i,
"]] <- ",
varText(functionName),
"(",
varText(data.list),
"[[",
i,
"]])"
)
evaluate <- parse(command)
print(evaluate)
eval(evaluate)
}
data.list
}
其中:
varText <- function(object){
deparse(substitute(object))
}
因此,我需要找到一种方法来访问数据框,提取其名称,并迭代一系列具有这些数据框名称的命令。
然后,我希望能够在全局环境中访问这些已修改的数据框。
......除非有人知道更好的解决办法。
编辑:可重复的示例
假设我创建了两个数据框并将它们添加到同一个列表中:
df1 <- data.frame(rnorm(100), rnorm(100))
df2 <- data.frame(rnorm(100), rnorm(100))
test.list <- list(df1, df2)
我创建了一个功能,可以轻松编辑传入的数据框:
testFunction <- function(data.frame){
data.frame$new.variable <- 0
}
然后我可以按照答案中的建议使用lapply
:
lapply(test.list, testFunction)
返回一个列表。
但是,如果您拨打df1
或df2
,则会保持不变。已创建的内容是df1
和df2
的修改版本,但它们存储在lapply
创建的列表中。
我想能够输入
df1
df2
让他们被修改。
有没有办法做到这一点,以便您不必将列表lapply
创建的元素分配给您想要访问的变量的名称?
非常感谢!
答案 0 :(得分:1)
如果我理解正确,您是否希望将函数应用于数据框列表?
在这种情况下,lapply()
是您的朋友,并且比for()
循环效率更高。
根据您修改后的示例,尝试以下内容:
# data
df1 <- data.frame(rnorm(100), rnorm(100))
df2 <- data.frame(rnorm(100), rnorm(100))
test.list <- list(df1, df2)
# function
out.list <- lapply(test.list, function(x) {x$.new.variable <- 0; x})
# name the df's in the list and check the output
names(out.list) <- c("df1", "df2")
str(out.list)
这会将该函数应用于列表中的每个对象,并将结果作为列表返回[使用@thelatemail的建议编辑]。
如果您想访问修改后的数据框,可以按名称调用它们:
out.list$df1
或者,如果要将df返回到全局环境,只要使用上面的步骤命名df,就可以使用以下命令:
list2env(out.list ,.GlobalEnv)
那应该做你需要的。