0

我有一个 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))

但我无法提取sitemodel.type即使u.obs[[1]]$site[1]工作正常。有人可以帮助我吗?谢谢

4

2 回答 2

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,你会得到你期望的结果。但是,summariseandplyr的优点在于您不必像那样构建 data.frame。相反,使用ldply

summ.df <- ldply(u.obs, 
                 summarise,
                 obs.min=min(swe.obs),
                 site=site[1])
于 2013-07-25T19:03:37.163 回答
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
于 2013-07-25T19:13:01.277 回答