gpt4 book ai didi

r - 带向量函数的数据表聚合,取 2

转载 作者:行者123 更新时间:2023-12-04 18:06:59 27 4
gpt4 key购买 nike

我正在努力使用 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,~y,function(dtbit) coef(lm(z~x,dtbit)))

问题 2:使用具有向量输入和输出的函数
xzsummary <- function(dtbit) t(summary(dtbit[,"x"]-dtbit[,"z"]))

ddply(dt,~y,xzsummary )

我可以在 data.table 中轻松地做那种事情吗?

如果这些问题已经得到显着回答,我们深表歉意。

这是一个类似但不完全相同的问题:
data.table aggregations that return vectors, such as scale()

最佳答案

> 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 的诀窍(与 list 相比)是它构造了一个多元素列表,给定一个向量,而 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,~y,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

我为那个解决方案感到自豪,但也注意到 fortunes::fortune("Liaw-Baron principle") ………………

Lastly, by what we could call the 'Liaw-Baron principle', every question that can be asked has in fact already been asked. -- Dirk Eddelbuettel (citing Andy Liaw's and Jonathan Baron's opinion on unique questions on R-help) R-help (January 2006)



.... 我搜索了: [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 次来收集这些示例,因此可能还有一些我没有发现的珍珠。

关于r - 带向量函数的数据表聚合,取 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663257/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com