使用dlply / ldply R从嵌套列表中获取数据帧

时间:2014-03-31 21:01:44

标签: r plyr

我正在使用dlply将函数应用于data.frame并为每个因子组合生成一个列表:

首先我生成一些数据

is1 <- data.frame()
for( s in c("Big","Med", "Sma")) {
 for(i in 1:3){

 c <- rnorm(1,0,10)
 n <- rnorm(1,-1,10)
 is1 <- rbind(is1,data.frame(Site=i,SizeClass=s,d13C=rnorm(10,c,2),d15N=rnorm(10,n,2)))
 }
}

他们应用siar包中的函数

require(plyr)
require(siar)
ell <-dlply(is1,.(Site,SizeClass),function(x) standard.ellipse(x$d13C,x$d15N,steps=1))

我想要一个包含某些字段的data.frame,所以我尝试使用带有函数的ldply

extract_SEAc <- function(e)
{
  c(sapply(e, '[[', 'xSEAc'),sapply(e, '[[', 'ySEAc'))
}
ell <- ldply(ell, .(Site,SizeClass), extract_SEAc )

但是它会出错

error: trying to apply a no-function

任何想法?

1 个答案:

答案 0 :(得分:3)

来自签名:

ldply(.data, .fun = NULL, ..., .progress = "none", 
      .inform = FALSE, .parallel = FALSE, .paropts = NULL)

ldply没有像.variables这样的dlply参数(并且...隐含的 因为它们作为args传递给.fun)。

非常确定这会得到你想要的东西(而且,我相当确定有更好的方法可以做到这一点):

extract_SEAc <- function(e) {
 data.frame(e$xSEAc, e$ySEAc)
}

e2 <- ldply(ell, extract_SEAc)

head(e2)
  Site SizeClass   e.xSEAc  e.ySEAc
1    1       Big -2.462496 12.28447
2    1       Big -2.473344 12.24886
3    1       Big -2.484814 12.21326
4    1       Big -2.496901 12.17769
5    1       Big -2.509601 12.14216
6    1       Big -2.522911 12.10669