我的问题很简单,有很多答案"用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(不是列表)。
谢谢。
只是要添加其他解决方案不起作用的原因: - 他们似乎没有制作框架,他们似乎一直在制作列表,似乎我必须手动进行转换。
另一种表达这个问题的方法是如何使用循环从列表创建数据帧。
答案 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)