R import excel,from list使用循环创建多个数据框

时间:2017-05-26 14:11:08

标签: r

我的问题很简单,有很多答案"用lapply给我一些我不想要的东西。它们没有用,因为我得到一个列表然后我必须做另一个循环来获取数据帧,我遇到了同样的问题:使用序列化名称一次创建几个数据帧。这就是为什么我要问一个新问题。

我有一个包含5张不同表格的excel文件,我想创建5个不同的数据帧。

library(openxlsx)

ln=list()
for (i in 2:6) 
  {
ln[[i]]<-read.xlsx("File.xlsx", sheet=i-1, startRow=3)

}

然后,我知道我能做到:

mo_1<-data.frame(ln[[2]])

看起来它会给我正确的工作表文件。 但是,我需要为所有工作表执行此操作。我的尝试是:

for (i in 2:6){
  mo_[i]<-data.frame(ln[[i]])
}

这让我遇到了和以前一样的问题。 P

所以我需要5个文件:mo2,...,mo6,我希望它们是DATAFRAMES(不是列表)。

谢谢。

只是要添加其他解决方案不起作用的原因: - 他们似乎没有制作框架,他们似乎一直在制作列表,似乎我必须手动进行转换。

另一种表达这个问题的方法是如何使用循环从列表创建数据帧。

1 个答案:

答案 0 :(得分:0)

重新考虑lapply解决方案,因为您可以使用list2env将命名的数据框列表的元素输出到单独的对象中。请务必使用setNames之前的元素命名:

library(openxlsx)

ln <- lapply(2:6, function(i) read.xlsx("File.xlsx", sheet=i-1, startRow=3))    
ln <- setNames(ln, paste0("mou_", 1:5))

list2env(ln, envir=.GlobalEnv)

话虽如此,没有真正的理由使用单独的对象,因为你仍然可以使用列表进行df操作,特别是当你评论时,可以有50个数据帧,听起来像它们保持相似的结构。只管理一个对象而不是多个:

merge(ln$mou_1, ln$mou_2, by="id")

aggregate(.~group1 + group2, ln$mou_3, FUN=sum)

rbind(ln$mou_4, ln$mou_5)