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.
    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
我想念什么明显的东西?
R version 2.12.2 (2011-02-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_CA.UTF-8       LC_NUMERIC=C               LC_TIME=en_CA.UTF-8        LC_COLLATE=en_CA.UTF-8    
 [5] LC_MONETARY=C              LC_MESSAGES=en_CA.UTF-8    LC_PAPER=en_CA.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_CA.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] grid      splines   stats     graphics  Grdevices utils     datasets  methods   base     

other attached packages:
[1] foreign_0.8-42  ggplot2_0.8.9   proto_0.3-9.1   reshape_0.8.4   plyr_1.4.1      rms_3.3-0       Hmisc_3.8-3    
[8] survival_2.36-5 stringr_0.4    

loaded via a namespace (and not attached):
[1] cluster_1.13.3  lattice_0.19-23 tools_2.12.2   
    

解决方法

只需进行两项更改 删除函数内部的打印命令,以便返回中值 按照约书亚的建议加ѭ2 大功告成! 这是带有输出的简化代码
library(plyr)
highab <-subset(baseball,ab >= 600)
baseball3 <-ddply(highab,.(id),transform,medianAB = median(ab))
summary(baseball3$medianAB)
  最小第一区中位数均值第三区   最高     600.0 612.0 621.5 623.1 631.5 677.0     ,抱歉。我误解了这个问题。 参见
?transform
。您需要将所需的新变量指定为“ 5”对。所以你需要像
baseball3 <- ddply(highab,medianAB=testfunc1(ab))
    ,起初,我喜欢使用惯用语将派生的列添加到data.frame中,但是我发现使用ѭ7slow会大大减慢速度。 在
ddply()
中使用lambda形式并随后调用合并
merge()
会更好吗?计时似乎很值得:
    > library(plyr)
    > highab <-subset(baseball,ab >= 600)
    > 
    > system.time( 
    +   baseball3.lambda <-merge(highab,+     ddply(highab,+       function(u) data.frame(medianAB = median(u$ab)))),FALSE)
       user  system elapsed 
      0.336   0.000   0.336 
    > 
    > system.time( 
        baseball3.orig <- ddply(highab,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 
十分之三秒似乎并不多,但是却使执行时间减半。通过选择整个
baseball
数据集,改进甚至更大。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...