【问题标题】:Getting a dataframe from a nested list using dlply/ldply R使用 dlply/ldply R 从嵌套列表中获取数据框
【发布时间】:2014-03-31 21:01:43
【问题描述】:

我正在使用 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

有什么想法吗?

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    来自签名:

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

    ldply 没有像dlply 这样的.variables 参数(并且,... 暗示了它,因为它们作为参数传递给.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
    

    【讨论】:

    • 你认为有什么更好的方法吗?
    • 我不得不考虑一下,但每当我最终做类似ldply(ell, extract_SEAc)[1:2] 的事情(像调用ldply 这样的后期运行)时,我总是感觉像一个黑客。不过,这可以为您提供所需的东西,所以我会使用它,前提是您了解它在做什么。
    • 但是你的答案不是我打算做的,你的结果只是因素,我需要变量 ySEAc 和 xSEAc 的值。
    • 我需要变量 ySEAc 和 xSEAc 成为新 data.frame 的列
    • 这样(修改示例)
    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 2021-05-24
    • 2017-06-16
    • 2017-12-31
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    相关资源
    最近更新 更多