【问题标题】:Learning to understand plyr, ddply学习理解 plyr、ddply
【发布时间】:2012-07-06 22:11:27
【问题描述】:

我一直试图通过尝试不同的变量和函数并查看结果来了解 plyr 的工作原理和方式。因此,我更多的是寻找关于 plyr 如何工作的解释,而不是具体解决它的答案。我已经阅读了文档,但我的新手大脑仍然没有得到它。

一些数据和名称:

mydf<- data.frame(c("a","a","b","b","c","c"),c("e","e","e","e","e","e")
                  ,c(1,2,3,10,20,30),
                  c(5,10,20,20,15,10))
colnames(mydf)<-c("Model", "Class","Length", "Speed")
mydf

问题 1:总结与转换语法

如果我输入:ddply(mydf, .(Model), summarise, sum = Length+Length)

我明白了:

`Model ..1
1     a   2
2     a   4
3     b   6
4     b  20
5     c  40
6     c  60

如果我输入:ddply(mydf, .(Model), summarise, Length+Length) 我会得到相同的结果。

现在如果使用变换:ddply(mydf, .(Model), transform, sum = (Length+Length))

我明白了:

  Model Class Length Speed sum
1     a     e      1     5   2
2     a     e      2    10   4
3     b     e      3    20   6
4     b     e     10    20  20
5     c     e     20    15  40
6     c     e     30    10  60

但如果我像第一个总结那样陈述它: ddply(mydf, .(Model), transform, (Length+Length))

  Model Class Length Speed
1     a     e      1     5
2     a     e      2    10
3     b     e      3    20
4     b     e     10    20
5     c     e     20    15
6     c     e     30    10

那么为什么添加“sum =”会有所不同呢?

问题 2:为什么这些不起作用?

ddply(mydf, .(Model), sum, Length+Length) #函数 (i) 中的错误:找不到对象“长度”

ddply(mydf, .(Model), length, mydf$Length) #Error in .fun(piece, ...) : 

2 个参数传递给需要 1 个的 'length'

这些例子更多地表明我根本不了解如何使用 plyr。

感谢任何回答者或解释。

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    我发现当我无法“可视化”R 中的任何功能工具如何工作时,最简单的做法是浏览单个实例:

    ddply(mydf, .(Model), function(x) browser() )
    

    然后实时检查x,这一切都应该是有意义的。然后,您可以在 x 上测试您的函数,如果它有效,您就是黄金(除非其他分组与您的第一个 x 不同)。

    【讨论】:

      【解决方案2】:

      语法是:

      ddply(data.frame, variable(s), function, optional arguments)
      

      函数应该返回data.frame。在你的情况下,

      • summarise 是一个函数,它将透明地创建一个新的 data.frame,并将您提供的表达式的结果作为进一步的参数 (...)

      • transform 是一个基本 R 函数,将转换 data.frames(首先由变量拆分),根据您作为进一步参数提供的表达式添加新列。这些需要命名,这就是转换的工作方式。

      如果您使用除子集、变换、变异、with、inside 或 summarise 之外的其他函数,您需要确保它们返回一个 data.frame(长度和总和不),或者至少返回一个输出适当长度的向量。

      【讨论】:

      • 另外,我相信 OP 中的第一组示例只是 summmarisetransform 之间默认行为的差异,如果您忽略在表达式中包含像 val = 这样的标签。 summarise 显然会提供自己的名称,而 transform 似乎会忽略它。
      【解决方案3】:

      我理解ddply(... , .(...) , summarise, ...) 操作的方式旨在减少行数以匹配.(...) 分组变量中不同组合的数量。因此,对于您的第一个示例,这似乎很自然:

      ddply(mydf, .(Model), summarise, sL = sum(Length)
        Model sL
      1     a  3
      2     b 13
      3     c 50
      

      好的。似乎对我有用(不是普通的 plyr 用户)。另一方面,transform 操作我理解是创建与数据帧长度相同的新列。这就是您的第一个transform 呼叫完成的。你的第二个(失败)是:

      ddply(mydf, .(Model), transform, (Length+Length))
      

      那个人没有为所执行的操作创建新名称,因此结果中没有新分配的内容。当您添加sum=(Length+Length) 时,突然有一个可用的名称,(并且sum 函数没有被使用)。使用函数名作为列名通常是个坏主意。

      关于问题二,我认为 .fun 参数需要是一个 plyr 函数或适用于整个(拆分)数据帧而不是任何旧函数的东西。没有sum.data.frame 功能。但是“nrow”或“ncol”确实有意义。你甚至可以让 'str' 在那个位置上工作。应用于数据帧的长度函数给出了列数:

       ddply(mydf, .(Model), length )  # all 4's
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        • 2015-05-12
        • 1970-01-01
        相关资源
        最近更新 更多