我正在尝试学习如何在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
答案 0 :(得分:3)
只需进行两次更改
medianAB = testfunc1(ab)
你完成了!
以下是带输出的简化代码
library(plyr)
highab <-subset(baseball, ab >= 600)
baseball3 <-ddply(highab, .(id), transform, medianAB = median(ab))
summary(baseball3$medianAB)
最小。第一曲。中位数平均值3 最大。 600.0 612.0 621.5 623.1 631.5 677.0
答案 1 :(得分:0)
对不起。我误解了这个问题。
请参阅?transform
。您需要将所需的新变量指定为tag=value
对。所以你需要像
baseball3 <- ddply(highab, .(id), transform, medianAB=testfunc1(ab))
答案 2 :(得分:0)
起初我喜欢将派生列添加到data.frame的习惯用法,但我发现transform()
的使用速度远远超出了大型集合。
在ddply()
中使用lambda表单以及后续调用合并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
三分之一秒可能看起来不多,但它的执行时间减半。通过选择整个baseball
数据集,可以实现更大的改进。