带向量函数的数据表聚合,取2
我正在努力使用data.table来总结向量函数的结果,这在ddply中很容易.
问题1:使用向量输出聚合(昂贵)函数 dt <- data.table(x=1:20,y=rep(c("a","b"),each=10)) 这个ddply命令产生了我想要的东西: ddply(dt,~y,function(dtbit) quantile(dtbit$x)) 此数据表命令不能执行我想要的操作: dt[,quantile(x),by=list(y)] 我可以像这样破解data.table: dt[,list("0%"=quantile(x,0),"25%"=quantile(x,0.25),"50%"=quantile(x,0.5)),by=list(y)] 但是那个冗长,如果矢量函数“分位数”很慢,也会很慢. 一个类似的例子是: dt$z <- rep(sqrt(1:10),2) ddply(dt,function(dtbit) coef(lm(z~x,dtbit))) 问题2:使用带矢量输入和输出的函数 xzsummary <- function(dtbit) t(summary(dtbit[,"x"]-dtbit[,"z"])) ddply(dt,xzsummary ) 我可以在data.table中轻松完成这类工作吗? 如果这些问题已得到明确回答,请道歉. 这是一个类似的,不完全相同的问题: 解决方法> dt[,as.list(quantile(x)),by=y] y 0% 25% 50% 75% 100% 1: a 1 3.25 5.5 7.75 10 2: b 11 13.25 15.5 17.75 20 我尝试使用rbind,但是没能产生我认为你想要的by-y安排. as.list(与列表对比)的技巧是它构造一个多元素列表wehn givne一个向量,而list只将向量放入一个元素列表. as.list表现得像sapply(x,list): > dt[,sapply(quantile(x),list),by=y] y 0% 25% 50% 75% 100% 1: a 1 3.25 5.5 7.75 10 2: b 11 13.25 15.5 17.75 20 您的目标解决方案 > ddply(dt,function(dtbit) quantile(dtbit$x)) y 0% 25% 50% 75% 100% 1 a 1 3.25 5.5 7.75 10 2 b 11 13.25 15.5 17.75 20 我为这个解决方案感到自豪,但是注意到了财富:“财富”(“Liaw-Baron原则”)…………
….我搜索了:[r] data.table as.list,发现我绝不是第一个在SO上发布此策略的人: Tabulate a data frame in R Using ave() with function which returns a vector create a formula in a data.table environment in R 我真的不知道这个问题是否会被认为是重复的,但我特别感谢@ G.Grothedieck的最后一个问题.这可能是我选择策略的地方.这次搜索大约有125次点击,我只是通过前20次搜集这些例子,所以可能还有一些我没有发现的珍珠. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |