r – 基于join的update.table子集
发布时间:2020-12-12 16:46:20 所属栏目:MsSql教程 来源:网络整理
导读:我有两个数据表,DT1和DT2: set.seed(1)DT1-data.table(id1=rep(1:3,2),id2=sample(letters,6),v1=rnorm(6),key="id2")DT1## id1 id2 v1## 1: 2 e 0.7383247## 2: 1 g 1.5952808## 3: 2 j 0.3295078## 4: 3 n -0.8204684## 5: 3 s 0.5757814## 6: 1 u 0.48742
我有两个数据表,DT1和DT2:
set.seed(1) DT1<-data.table(id1=rep(1:3,2),id2=sample(letters,6),v1=rnorm(6),key="id2") DT1 ## id1 id2 v1 ## 1: 2 e 0.7383247 ## 2: 1 g 1.5952808 ## 3: 2 j 0.3295078 ## 4: 3 n -0.8204684 ## 5: 3 s 0.5757814 ## 6: 1 u 0.4874291 DT2<-data.table(id2=c("n","u"),v1=0,key="id2") DT2 ## id2 v1 ## 1: n 0 ## 2: u 0 我想基于与DT2的连接来更新DT1,但仅适用于DT1的一个子集.例如,对于DT1 [id1 == 3],我希望在第4行中的v1值更新,如下面的结果: DT1 ## id1 id2 v1 ## 1: 2 e 0.7383247 ## 2: 1 g 1.5952808 ## 3: 2 j 0.3295078 ## 4: 3 n 0 ## 5: 3 s 0.5757814 ## 6: 1 u 0.4874291 我知道如何更新一个表(使用:=赋值运算符),如何加入表(DT1 [DT2])以及如何对表进行子集(DT1 [id1 == 3]).但是我不知道如何一下子全部三个. 编辑: set.seed(2) DT1b<-DT1[,v2:=rnorm(6)] # Copy DT1 and add a new column setkey(DT1b,id2) DT1b ## id1 id2 v1 v2 ## 1: 2 e 0.7383247 -0.89691455 ## 2: 1 g 1.5952808 0.18484918 ## 3: 2 j 0.3295078 1.58784533 ## 4: 3 n -0.8204684 -1.13037567 ## 5: 3 s 0.5757814 -0.08025176 ## 6: 1 u 0.4874291 0.13242028 DT2b<-rbindlist(list(DT2,data.table(id2="e",v1=0))) # Copy DT2 and add a new row DT2b[,v2:=-1] # Add a new column to DT2b setkey(DT2b,id2) DT2b ## id2 v1 v2 ## 1: e 0 -1 ## 2: n 0 -1 ## 3: u 0 -1 基于@nmel和@BlueMagister的有用答案,我想出了这个更新方案的解决方案: DT1b[DT2b[DT1b[id1 %in% c(1,2)],nomatch=0],c("v1","v2"):=list(i.v1,i.v2)] DT1b ## id1 id2 v1 v2 ## 1: 2 e 0.0000000 -1.00000000 ## 2: 1 g 1.5952808 0.18484918 ## 3: 2 j 0.3295078 1.58784533 ## 4: 3 n -0.8204684 -1.13037567 ## 5: 3 s 0.5757814 -0.08025176 ## 6: 1 u 0.0000000 -1.00000000 解决方法我可以想到的最简单的方法是通过id1键.例如 setkey(DT1,id2,id1) DT2[,id1 := 3] setkey(DT2,id1) # use i.v1 to reference v1 from the i component DT1[DT2,v1 := i.v1 ] DT1 id1 id2 v1 1: 2 e 0.7383247 2: 1 g 1.5952808 3: 2 j 0.3295078 4: 3 n 0.0000000 5: 3 s 0.5757814 6: 1 u 0.4874291 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- 当从.Net应用程序调用SQL函数与在Management Stu
- SqlServer书上:使用游标输出学生姓名、选修课程
- 如何检查SQL Server datetime列是否为空?
- 在RethinkDB中,检查数据库或表是否存在最简单的方
- 如何为每个帐户的上次交易进行SQL查询?
- tsql – SQL – CASE STATEMENT – WHEN语句AND语
- sql-server – SQL Server 2005:SQL Server身份
- sql – 为什么当我(手动)缓存临时表中的表值函数
- sql函数实现去除字符串中的相同的字符串
- MySQL ERROR 1045 (28000): Access denied for u
热点阅读