问题描述
|
我正在尝试学习如何在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
数据集,改进甚至更大。