gpt4 book ai didi

r - 在R中拆分apply recombine,plyr,data.table

转载 作者:行者123 更新时间:2023-12-04 13:28:25 24 4
gpt4 key购买 nike

我正在R中进行经典的拆分应用重组操作。随着时间的推移,我的数据集是一堆公司。我正在做的应用程序是对每个公司进行回归并返回残差,因此,我未按公司进行汇总。 plyr对此非常有用,但是当公司数量很大时,它需要非常长的时间才能运行。有没有办法用data.table做到这一点?

样本数据:

dte, id, val1, val2
2001-10-02, 1, 10, 25
2001-10-03, 1, 11, 24
2001-10-04, 1, 12, 23
2001-10-02, 2, 13, 22
2001-10-03, 2, 14, 21

我需要按每个ID(即1和2)进行拆分。运行回归,返回残差并将其作为列附加到我的数据中。有没有办法使用 data.table做到这一点?

最佳答案

我猜这需要按“id”排序才能正确排列。幸运的是,当您设置 key 时,这种情况会自动发生:

dat <-read.table(text="dte, id, val1, val2
2001-10-02, 1, 10, 25
2001-10-03, 1, 11, 24
2001-10-04, 1, 12, 23
2001-10-02, 2, 13, 22
2001-10-03, 2, 14, 21
", header=TRUE, sep=",")
dtb <- data.table(dat)
setkey(dtb, "id")
dtb[, residuals(lm(val1 ~ val2)), by="id"]
#---------------
cbind(dtb, dtb[, residuals(lm(val1 ~ val2)), by="id"])
#---------------
dte id val1 val2 id.1 V1
[1,] 2001-10-02 1 10 25 1 1.631688e-15
[2,] 2001-10-03 1 11 24 1 -3.263376e-15
[3,] 2001-10-04 1 12 23 1 1.631688e-15
[4,] 2001-10-02 2 13 22 2 0.000000e+00
[5,] 2001-10-03 2 14 21 2 0.000000e+00



> dat <- data.frame(dte=Sys.Date()+1:1000000,
id=sample(1:2, 1000000, repl=TRUE),
val1=runif(1000000), val2=runif(1000000) )
> dtb <- data.table(dat)
> setkey(dtb, "id")
> system.time( cbind(dtb, dtb[, residuals(lm(val1 ~ val2)), by="id"]) )
user system elapsed
1.696 0.798 2.466
> system.time( dtb[,transform(.SD,r = residuals(lm(val1~val2))),by = "id"] )
user system elapsed
1.757 0.908 2.690

Matthew的 编辑:
这对于CRAN上的v1.8.0都是正确的。加上一点点,即 transform中的 jdata.table wiki要点2的主题:“为了提高速度,请不要按组 transform(),之后再使用 cbind()”。但是, :=现在在v1.8.1中按组工作,既简单又快速。请参阅我的答案以获取插图(但无需投票)。

好吧,我投了赞成票。这是在Mac上安装v 1.8.1的控制台命令(如果您有适当的XCode工具可用,因为它仅在源代码中提供):
install.packages("data.table", repos= "http://R-Forge.R-project.org", type="source", 
lib="/Library/Frameworks/R.framework/Versions/2.14/Resources/lib")

(由于某种原因,我无法使Mac GUI软件包安装程序将r-forge作为存储库读取。)

关于r - 在R中拆分apply recombine,plyr,data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11279304/

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