我是R的新手,我有一个问题是将一个非常大的数据框拆分成一个嵌套列表。我试图在互联网上寻求帮助,但我没有成功。
我有一个关于我的数据组织方式的简化示例:
标题是:
1 "station" (number)
2. "date.str" (date string)
3. "member"
4. "forecast time"
5. "data"
我不确定我的数据示例是否会正确显示,但如果是这样,它看起来像这样:
1. station date.str member forecast.time data1
2. 6019 20110805 mbr000 06 77
3. 6031 20110805 mbr000 06 28
4. 6071 20110805 mbr000 06 45
5. 6019 20110805 mbr001 12 22
6. 6019 20110806 mbr024 18 66
我想在“station”,“member”,“date.str”和“forecast.time”之后将大数据框拆分为嵌套列表。因此,mylist [[c(s,m,d,t)]]包含一个数据框,其中包含用于“s”的数据和用于date.str“d”的成员“m”以及用于保存值的预测时间“t” s,m,d和t。
data.st <- list()
data.st.member <- list()
data.st.member.dato <- list()
data.st. <- split(mydata, mydata$station)
data.st.member <- lapply(data.st, FUN = fsplit.member)
(我创建了一个在“成员”之后拆分的功能)
#Loop over station number:
for (s in 1:S){
#Loop over members:
for (m in 1:length(members){
tmp <- split( data.st.member[[s]][[m]], data.st.member[[s]][[m]]$dato.str )
#Loop over number of different "date.str"s
for (t in 1:length(no.date.str) ){
data.st.member.dato[[s]][[m]][[t]] <- tmp}
} #end m loop
} #end s loop
我还想根据预测时间分开:forec.time,但我没有那么远。
我在循环中尝试了几种不同的配置,所以我目前没有一致的错误消息。我无法弄明白,我在做什么或想错了什么。
非常感谢任何帮助!
此致 Sisse
答案 0 :(得分:1)
这比你想象的要容易。您可以将列表传递到split
,以便分成几个因素。
可重复的例子
with(airquality, split(airquality, list(Month, Day)))
使用您的数据
data.st <- with(mydata,
split(mydata, list("station", "member", "date.str", "forecast.time"))
)
注意:这并没有像你要求的那样给你一个嵌套列表,但正如Joran评论的那样,你很可能不希望如此。平面列表可以更好地使用。
狂野地猜测:您是否只想计算不同数据块的统计数据?如果是这样,那么请在split-apply-combine问题上查看许多问题。
答案 1 :(得分:1)
我还想回应其他人,因为这种递归数据结构很难处理,并且可能有更好的方法。正如Richie建议的那样,看看split-apply-combine方法。但是,约束可能是外部的,因此这里是使用plyr
库的答案。
mylist <- dlply(mydata, .(station), dlply, .(memeber), dlply, .(date.str), dlply, .(forecast.time), identity)
使用您为mydata
提供的数据片段,
> mylist[[c("6019","mbr000","20110805","6")]]
station date.str member forecast.time data1
1 6019 20110805 mbr000 6 77