plyr在转换后不返回新变量
我正在努力学习如何在R/plyr中编写函数。我知道有更简单的方法来做我下面展示的事情,但这不是重点 在下面的示例中,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.
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表单,然后调用mergemerge()
?时间安排看起来很值得:
> 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上的adaptplyr
方法来充分利用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