【问题标题】:Using lapply to apply a function over list of data frames and saving output to files with different names使用 lapply 对数据框列表应用函数并将输出保存到具有不同名称的文件中
【发布时间】:2013-06-05 18:28:32
【问题描述】:

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

例如

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() 将此函数应用于列表中的每个数据框

类似:

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

我不知道如何在 lapply 的上下文中分配“i”,以便i 迭代数据框列表中的名称,保存多个具有不同名称的文件(在这种情况下,两个文件命名为AB) 对应于修改后的数据帧。

【问题讨论】:

  • 我知道你说过你试图避免使用 for 循环,但我认为在这种情况下使用 for 循环是正确的。如果没有返回任何内容,我不喜欢使用lapply()plyr 包中的 l_ply() 之类的东西可能更合适。或者只是一个 for 循环。

标签: r dataframe lapply


【解决方案1】:

它将适用于以下lapply 调用:

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

【讨论】:

    【解决方案2】:

    有很多选择。例如:

      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')))
    

    【讨论】:

    • 感谢您的回复...但是,我尝试了这两个选项,但它们似乎不适用于在 lapply 命令之外定义的函数。我真正的函数需要做一堆分析,然后保存所有结果,所以没有选择在一行中定义它。
    猜你喜欢
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多