首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >拆分应用重组,plyr,R中的data.table

拆分应用重组,plyr,R中的data.table
EN

Stack Overflow用户
提问于 2012-07-01 03:18:27
回答 2查看 1.5K关注 0票数 6

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

示例数据:

代码语言:javascript
运行
AI代码解释
复制
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实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-01 03:32:12

我猜这需要按"id“排序才能正确排列。幸运的是,当您设置关键点时,这会自动发生:

代码语言:javascript
运行
AI代码解释
复制
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是完全正确的。除了j中的transformdata.table wiki第2点的主题:“为了速度,不要按组执行transform(),之后执行cbind()”。但是,在v1.8.1中,:=现在是按组工作的,并且既简单又快速。请看我的答案来说明(但不需要投票)。

好吧,我投了赞成票。下面是在Mac上安装v1.8.1的控制台命令(如果你有合适的XCode工具,因为它只在源代码中):

代码语言:javascript
运行
AI代码解释
复制
install.packages("data.table", repos= "http://R-Forge.R-project.org", type="source", 
               lib="/Library/Frameworks/R.framework/Versions/2.14/Resources/lib")

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

票数 6
EN

Stack Overflow用户

发布于 2012-07-01 17:06:15

DWin的答案对于v1.8.0是正确的(就像当前在CRAN上一样)。但在v1.8.1 (在R-Forge存储库上)中,:=现在是按组工作的。它也适用于不连续的组,所以不需要首先使用setkey来排队。

代码语言:javascript
运行
AI代码解释
复制
dtb <- as.data.table(dat)
dtb
           dte id val1 val2
1:  2001-10-02  1   10   25
2:  2001-10-03  1   11   24
3:  2001-10-04  1   12   23
4:  2001-10-02  2   13   22
5:  2001-10-03  2   14   21
dtb[, resid:=residuals(lm(val1 ~ val2)), by=id]
           dte id val1 val2         resid
1:  2001-10-02  1   10   25  1.631688e-15
2:  2001-10-03  1   11   24 -3.263376e-15
3:  2001-10-04  1   12   23  1.631688e-15
4:  2001-10-02  2   13   22  0.000000e+00
5:  2001-10-03  2   14   21  0.000000e+00

要升级到v1.8.1,只需从R-Forge存储库安装即可。(从R- 2.15.0+安装任何二进制包时都需要R Forge):

代码语言:javascript
运行
AI代码解释
复制
install.packages("data.table", repos="http://R-Forge.R-project.org")

如果你不能升级到最新的R,也可以从源代码安装。data.table本身只需要R 2.12.0+。

扩展到1 1MM的情况:

代码语言:javascript
运行
AI代码解释
复制
DT = data.table(dte=Sys.Date()+1:1000000, 
                id=sample(1:2, 1000000, repl=TRUE),
                val1=runif(1000000),  val2=runif(1000000) )
setkey(DT, id)
system.time(ans1 <- cbind(DT, DT[, residuals(lm(val1 ~ val2)), by="id"]) )
   user  system elapsed 
 12.272   0.872  13.182 
ans1
                dte id      val1       val2 id           V1
      1: 2012-07-02  1 0.8369147 0.57553383  1  0.336647598
      2: 2012-07-05  1 0.0109102 0.02532214  1 -0.488633325
      3: 2012-07-06  1 0.4977762 0.16607786  1 -0.001952414
     ---                                                   
 999998: 4750-05-27  2 0.1296722 0.62645838  2 -0.370627034
 999999: 4750-05-28  2 0.2686352 0.04890710  2 -0.231952238
1000000: 4750-05-29  2 0.9981029 0.91626787  2  0.497948275

system.time(DT[, resid:=residuals(lm(val1 ~ val2)), by=id])
   user  system elapsed 
  7.436   0.648   8.107 
DT
                dte id      val1       val2        resid
      1: 2012-07-02  1 0.8369147 0.57553383  0.336647598
      2: 2012-07-05  1 0.0109102 0.02532214 -0.488633325
      3: 2012-07-06  1 0.4977762 0.16607786 -0.001952414
     ---                                                
 999998: 4750-05-27  2 0.1296722 0.62645838 -0.370627034
 999999: 4750-05-28  2 0.2686352 0.04890710 -0.231952238
1000000: 4750-05-29  2 0.9981029 0.91626787  0.497948275

上面的示例只有两个组,非常小,不到40MB,Rprof显示96%的时间花在lm上。因此,在这些情况下,:= by group实际上不是为了速度优势,而是为了方便;即,需要编写的代码更少,并且没有多余的列添加到输出中。随着大小的增长,避免了副本的出现,速度优势开始显现。特别是,随着组数量的增加,j中的transform会变得非常慢。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11279304

复制
相关文章
移动开发-媒体查询布局
每种媒体类型都有各自不同的特性,根据不同媒体类型的媒体特性设置不同的展示风格,暂且了解三个,注意他们要加小括号包含
小城故事
2022/11/21
1.3K0
CMT:当CNN遇到Transformer,“迷途知返”
由于其所具有的长距离依赖建模能力,Vision Transformers已被成功应用到图像识别任务中。然而,其性能与计算量距离优秀的CNN仍存在差距。
AIWalker
2021/07/29
1.2K0
CMT:当CNN遇到Transformer,“迷途知返”
当大模型不是问题时,如何应对 LLM 的工程化落地挑战?
几个月前,在 Thoughtworks 的内部 AIGC 研讨会里,我们一直达成了一系列一致观点,诸如于:如果没有 “开源模型” 降低企业应用 LLM 的成本,那么 LLM 会很快消亡。所以,我们相信开源 LLM + LoRA 微调会成为企业的一种主流方式。现今,我们可以看到 LLaMA 2、Code LLaMA 2 等模型在不断刷新这种可能性。
Phodal
2023/09/10
2.2K1
当大模型不是问题时,如何应对 LLM 的工程化落地挑战?
当AI泡沫破裂时……
很显然我们目前处于一个不稳定的状态。这到底是一场泡沫还是一次革命?答案是当然包含一点革命——深度神经架构所创造的实实在在的成功已经颠覆了视觉和语音识别领域,更通用的机器学习也已经有了大量真实世界用例。
刀刀老高
2018/07/24
3620
当AI泡沫破裂时……
很显然我们目前处于一个不稳定的状态。这到底是一场泡沫还是一次革命?答案是当然包含一点革命——深度神经架构所创造的实实在在的成功已经颠覆了视觉和语音识别领域,更通用的机器学习也已经有了大量真实世界用例。
机器之心
2018/07/26
3800
windows根据jps查询java进程然后关闭脚本
下面的脚本可以通过jps查询到具体进程,然后关闭该进程,最后一行脚本是重启该应用,下面一段脚本可以用于windows上重新发包功能
johnhuster的分享
2022/03/29
1K0
shell sort排序是从小到大_shell sort
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169879.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/21
1.4K0
shell sort排序是从小到大_shell sort
html --- rem 媒体查询
手机屏幕的分辨率越来越高,比如iPhone 5为640*1136 px、iPhone 6/6S为750*1334 px。我拿到的UI图,其参考分辨率为1440*2560 px。
小蔚
2019/09/11
1.5K0
响应式设计
给所有用户提供同一份 HTML 和 CSS。通过使用几个关键技术,根据用户浏览器视口的大小(或者屏幕分辨率)让内容有不一样的渲染结果。这种方式不需要分别维护两个网站。只需要创建一个网站,就可以在智能手机、平板,或者其他任何设备上运行。网页设计师 Ethan Marcotte 称这种方式为响应式设计(responsive design)。
Cellinlab
2023/05/17
2.2K0
CSS 媒体查询适配
media在引入css时可以加media属性来设置在特定媒体下的样式,但是要注意将其写在所有样式的最下方
圆圆的冬瓜
2022/06/17
1.4K0
【提问帖】GO中调用redis时,当并发量比较大时出现的问题。
GO中调用redis时,实始化一个连接池,做法也是一般的用户: &redis.Pool{ MaxIdle: beego.AppConfig.DefaultInt("redis::maxidle", 1), MaxActive: beego.AppConfig.DefaultInt("redis::maxactive", 10), IdleTimeout: time.Duration(beego.AppConfig.DefaultInt64("redis::idle_tim
李海彬
2018/03/27
2.2K0
CSS-媒体查询
由于媒体查询需要根据不同的浏览器宽度调整元素的样式, 所以不适合用于比较复杂的网页
程序员 NEO
2023/09/29
2270
CSS-媒体查询
前端响应式布局为什么是个坑?
响应式设计:Responseive design,就是一个网站,一套代码能在所有终端能够正常展示,并不是为每个终端做一个特定版本,响应式是为解决移动互联网浏览器而诞生的。
呆呆
2021/10/01
1.8K0
当安装、卸载件包时,出现依赖问题 error: Failed dependencies
依赖关系非常复杂,当你试图先安装任何一个包时都会出现这样的依赖关系错误,这时候你就应该强制安装了,我认为只要你把服务或软件需要的包都装上,强制安装也不会出问题的,不会有什么影响。
yaohong
2019/09/11
1.4K0
前端响应式布局为什么是个坑?
响应式设计:Responseive design,就是一个网站,一套代码能在所有终端能够正常展示,并不是为每个终端做一个特定版本,响应式是为解决移动互联网浏览器而诞生的。
呆呆
2021/11/30
9820
前端响应式布局为什么是个坑?
响应式设计:Responseive design,就是一个网站,一套代码能在所有终端能够正常展示,并不是为每个终端做一个特定版本,响应式是为解决移动互联网浏览器而诞生的。
呆呆
2021/09/30
9460
用PHP实现冒泡排序(从小到大)
改进代码: 添加一个布尔变量 $exchange, 以监视每($i+1)次冒泡排序是否发生过相邻元素交换的情况。如果有($exchange为true),则需继续进行下一次冒泡排序。如果没有发生过相邻元素交换的情况,则说明排序任务已经完成,无需进行下一次冒泡排序。这时,使用 break,立刻跳出 $i 循环体。
用户7108768
2021/09/23
5180
这个问题你应该很熟悉,然后懵逼,然后放弃
今天早晨决定写这篇博文,但是晚上回家的时候,突然一道闪电从脑海劈过,于是临时决定将这个熟悉然后到懵逼最后到放弃的问题分为两部分。第一部分为抛出问题,诚邀各路英雄豪杰解答;第二部分为解答,就是一周之后会给出我的答案。
IMWeb前端团队
2019/12/04
2810
这个问题你应该很熟悉,然后懵逼,然后放弃
点击加载更多

相似问题

将面板回归常数和残差保存在变量中

111

循环回归并将残差保存在列中

110

线性回归残差散点图

123

R循环残差回归

34

matlab优化选项将残差保存在变量中

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档