使用lapply在数据框列表上应用函数并将输出保存到具有不同名称的文件中

41

我有一个数据帧列表,并为列表中的每个元素(例如每个数据帧)命名:

例如:

df1 <- data.frame(x = c(1:5), y = c(11:15))  
df2 <- data.frame(x = c(1:5), y = c(11:15))  
mylist <- list(A = df1, B = df2)  

我有一个函数,我想将它应用于每个数据框;在这个函数中,我想包括一行代码将结果写入文件(最终我想做更复杂的事情,比如保存每个数据框中两个变量之间相关性的图形,但我想从简单的开始)

例如:

NewVar <- function(mydata, whichVar, i) {  
mydata$newVar <- mydata[, whichVar] + 1  
write.csv(mydata, file = i)  
}
我想使用lapply()将这个函数应用到我列表中的每个数据框,类似于:

something like:

hh<-lapply(mylist, NewVar, whichVar = "y")

我无法想出如何在lapply的上下文中分配变量"i",以便i可以在数据框列表中的名称上迭代,保存多个文件并使用不同的名称(在此例中为两个名为AB的文件),与修改后的数据框相对应。


2
我知道你说你想避免使用for循环,但我认为在这种情况下使用for循环是正确的。如果没有返回值,我不喜欢使用lapply()。像plyr包中的l_ply()可能更合适。或者只需使用for循环。 - Ciarán Tobin
3个回答

16

以下的 lapply 调用将起作用:

lapply(names(mylist), function(x) NewVar(mylist[[x]], "y", x))

14

有很多选择。例如:

  lapply(names(mylist),
         function(x)write.csv(mylist[x],
                              file =paste0(x,'.csv')))

或使用索引:

 lapply(seq_along(mylist),
     function(i)write.csv(mylist[i],
                          file =paste0(names(mylist)[i],'.csv')))

1
谢谢回复...然而,我尝试了这两个选项,它们似乎对于在lapply命令之外定义的函数不起作用。我的真实函数需要执行一堆分析,然后保存所有结果,因此无法在一行中定义它。 - user2414840

0
我曾经遇到过同样的问题,并且我使用了plyr()包中的l_ply()函数来解决它。
my_list <- list(df1, df2) my_function <- function(i) {...} library(plyr) l_ply(my_list, my_function)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接