plyr在转换后不返回新变量

plyr在转换后不返回新变量,r,plyr,R,Plyr,我正在努力学习如何在R/plyr中编写函数。我知道有更简单的方法来做我下面展示的事情,但这不是重点 在下面的示例中,PLYR不会将新变量返回到我的新数据帧 library(plyr) highab <-subset(baseball, ab >= 600) testfunc1 <-function(x) { print(x) #just to show me that the vector does get into the function. Works fine.

我正在努力学习如何在R/plyr中编写函数。我知道有更简单的方法来做我下面展示的事情,但这不是重点

在下面的示例中,PLYR不会将新变量返回到我的新数据帧

library(plyr)
highab <-subset(baseball, ab >= 600)

testfunc1 <-function(x) {
    print(x) #just to show me that the vector does get into the function. Works fine.
    medianAB <- median(x)
    print(medianAB) #just to prove that medianAB was calculated correctly. Works fine   
}


baseball3 <-ddply(highab, .(id), transform, testfunc1(ab))
str(baseball3$medianAB) #No medianAB

对不起。我误解了这个问题

请参见变换。您需要将所需的新变量指定为
tag=value
对。所以你需要像

baseball3 <- ddply(highab, .(id), transform, medianAB=testfunc1(ab))
baseball3只需做两个更改

  • 删除函数中的打印命令,以便返回中值
  • 按照Joshua的建议添加
    medianAB=testfunc1(ab)
  • 你完了

    下面是带有输出的简化代码

    library(plyr)
    highab <-subset(baseball, ab >= 600)
    baseball3 <-ddply(highab, .(id), transform, medianAB = median(ab))
    summary(baseball3$medianAB)
    
    库(plyr)
    高AB=600)
    
    baseball3起初,我喜欢将派生列添加到data.frame的习惯用法,但我发现
    transform()
    的使用速度慢得令人无法接受

    是否最好在
    ddply()
    中使用lambda表单,然后调用merge
    merge()
    ?时间安排看起来很值得:

        > library(plyr)
        > highab <-subset(baseball, ab >= 600)
        > 
        > system.time( 
        +   baseball3.lambda <-merge(highab, 
        +     ddply(highab, .(id), 
        +       function(u) data.frame(medianAB = median(u$ab)))), FALSE)
           user  system elapsed 
          0.336   0.000   0.336 
        > 
        > system.time( 
            baseball3.orig <- ddply(highab, .(id), 
              transform, medianAB = median(ab)), FALSE)
           user  system elapsed 
          0.640   0.000   0.641 
        > 
        > summary(baseball3.lambda$medianAB)
           Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
          600.0   612.0   621.5   623.1   631.5   677.0 
        > summary(baseball3.orig$medianAB)
           Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
          600.0   612.0   621.5   623.1   631.5   677.0 
    
    >库(plyr)
    >高AB=600)
    > 
    >系统时间(
    +baseball3.lambda
    >系统时间(
    baseball3.orig
    >摘要(baseball3.lambda$medianAB)
    最小第一个曲中位数平均第三个曲最大值。
    600.0   612.0   621.5   623.1   631.5   677.0 
    >摘要(Baseball 3.原始$medianAB)
    最小第一个曲中位数平均第三个曲最大值。
    600.0   612.0   621.5   623.1   631.5   677.0 
    

    十分之三秒可能看起来不多,但它将执行时间减少了一半。选择整个
    棒球
    数据集,改进更大。

    谢谢Joshua,但这两种方法都不起作用。这很奇怪。@John:对不起,我真的应该在提交答案之前测试一下…:-/我认为也需要1,但
    print(medianAB)
    将从函数返回
    medianAB
    ,因此您只需要#2。@joshua mmmm您是对的。想知道当我刚刚应用#2时出现了什么错误,并得到了一个错误。在函数调用之前指定了新变量就成功了。谢谢大家。例如,“baseball3”是“慢得让人无法接受的大集合”注释,您试过了吗>:=
    运算符通过引用添加列?不,我没有尝试
    数据。虽然我知道在许多情况下,表的速度很快。实际上我想找到/弄清楚的是如何合并这两种方法,拆分应用从
    ddply
    减少到
    data.table
    的速度提高。不幸的是,您将uld必须更改为data.table语法以获得速度优势:
    DT[i,j,by]
    。采用data.frames上的adapt
    plyr
    方法来充分利用
    data.table
    快速索引难道没有意义吗?毕竟
    data.table
    是一种基础设施改进,而不是解决状态问题的高级方法。…
    data.table
    是一种高级方法。您阅读了15篇文章了吗(独立)?
        > library(plyr)
        > highab <-subset(baseball, ab >= 600)
        > 
        > system.time( 
        +   baseball3.lambda <-merge(highab, 
        +     ddply(highab, .(id), 
        +       function(u) data.frame(medianAB = median(u$ab)))), FALSE)
           user  system elapsed 
          0.336   0.000   0.336 
        > 
        > system.time( 
            baseball3.orig <- ddply(highab, .(id), 
              transform, medianAB = median(ab)), FALSE)
           user  system elapsed 
          0.640   0.000   0.641 
        > 
        > summary(baseball3.lambda$medianAB)
           Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
          600.0   612.0   621.5   623.1   631.5   677.0 
        > summary(baseball3.orig$medianAB)
           Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
          600.0   612.0   621.5   623.1   631.5   677.0