我有一个data.frames列表,并希望从列表中构建一个新的data.frame,如下所示:
u=runif(2, 0, 1)
u.obs=list(data.frame(site='dl',
swe.obs=runif(4, 0, 1),
model.type='r'),
data.frame(site='nt',
swe.obs=runif(5, 0, 1),
model.type='lm'),
data.frame(site='nt',
swe.obs=runif(3,0,1),
model.type='lm'),
data.frame(site='nt',
swe.obs=runif(3,0,1),
model.type='r'))
编辑:@dickoa给出了一个适用于我的示例的答案,但不是真的,所以我添加到u.obs以使其更真实。
EDIT2:开玩笑吧。它看起来不一样,但我能说的是相同的。
summ.df=data.frame(model=u,
obs.min=laply(u.obs$swe.obs, min),
obs.max=laply(u.obs$swe.obs, max),
obs.mean=laply(u.obs$swe.obs, mean),
site=laply(u.obs$site, '[', 1),
model.type=laply(u.obs$model.type, '[', 1),
date=laply(u.obs$date, '[', 1))
但即使site
工作正常,我也无法取消model.type
和u.obs[[1]]$site[1]
。有人可以帮我吗?
感谢
答案 0 :(得分:1)
数字1:在代码中使用空格和回车符。它将帮助您和我们进行调试!
第2号:你的问题:
查看前几个laply
来电的结果:
laply(u.obs$swe.obs, min)
# logical(0)
这是因为u.obs$swe.obs
不存在。相反,你想要u.obs[[i]]$swe.obs
。你可以使用匿名函数或非常方便的summarise
来实现目标。
laply(u.obs, summarise, min(swe.obs))
现在您的后期作业不是0,您将获得预期的结果。然而,
关于summarise
和plyr
的优点是,您不必像这样构建data.frame。相反,请使用ldply
summ.df <- ldply(u.obs,
summarise,
obs.min=min(swe.obs),
site=site[1])
答案 1 :(得分:1)
如果您的最终数据具有相同的结构,则可以通过首先绑定(逐行)数据来更改您的方法。
使用您的数据
set.seed(1)
u <- runif(2, 0, 1)
u.obs <- list(
data.frame(site='dl',
swe.obs=runif(4, 0, 1),
model.type='r'),
data.frame(site='nt',
swe.obs=runif(5, 0, 1),
model.type='lm'))
我们可以这样吗
require(plyr)
ddply(do.call(rbind, u.obs), .(site, model.type), summarise,
obs.min = min(swe.obs),
obs.max = max(swe.obs),
obs.mean = mean(swe.obs))
## site model.type obs.min obs.max obs.mean
## 1 dl r 0.201682 0.90821 0.64528
## 2 nt lm 0.061786 0.94468 0.50047