小心地获取单一价值

时间:2013-07-25 18:53:23

标签: r list dataframe plyr

我有一个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.typeu.obs[[1]]$site[1]。有人可以帮我吗? 感谢

2 个答案:

答案 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,您将获得预期的结果。然而, 关于summariseplyr的优点是,您不必像这样构建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