【问题标题】:Problems splitting data frame into a nested list将数据框拆分为嵌套列表的问题
【发布时间】:2011-08-30 17:13:17
【问题描述】:

我是 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,但我没有做到。

我在循环中尝试了几种不同的配置,所以我目前没有一致的错误消息。我无法弄清楚,我在做什么或想错了什么。

非常感谢任何帮助!

问候 西塞

【问题讨论】:

  • 我不愿意帮你做这件事,因为我相信嵌套列表比你的原始数据框更难处理。为什么需要将看起来组织良好的数据框拆分为嵌套列表?
  • 感谢帮助和cmets!数据由预测累积降水的时间序列组成。对于每个站号 (s),对于一组预报 (m) 的每个成员,以及对于每个预报时间 (t),我需要获取降水的时间序列。从 precipitation 的值可以看出我弄错了,除非我除以所有值:s、m、d 和 t。

标签: list r split nested


【解决方案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 问题上的许多问题。

【讨论】:

  • 但是由于数据框是列表,它真的不提供嵌套列表吗?
  • 感谢您的帮助!是的,这就是我想要的。我需要预测累积降水的时间序列来与观察到的每小时值进行比较。有一个预报集合,对于每个集合成员 (m),每个预报时间(00、06、12 和 18)都有一个 39 小时长的预报。我希望将这个 39 小时的预测与观察结果进行比较。数据被内插到观测站。我忘了在我的数据示例中指出预测的提前期 (00:39)。如果我有任何不清楚的地方,我深表歉意。
【解决方案2】:

我还想回应其他人,因为这种递归数据结构将很难使用,并且可能有更好的方法。请查看 Richie 建议的拆分应用组合方法。但是,约束可能是外部的,因此这里是使用 plyr 库的答案。

mylist <- dlply(mydata, .(station), dlply, .(memeber), dlply, .(date.str), dlply, .(forecast.time), identity)

使用您为mydata 提供的数据的 sn-p,

> mylist[[c("6019","mbr000","20110805","6")]]
  station date.str member forecast.time data1
1    6019 20110805 mbr000             6    77

【讨论】:

    猜你喜欢
    • 2021-03-15
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2011-05-18
    • 2022-12-22
    相关资源
    最近更新 更多