微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

r – 基于join的update.table子集

我有两个数据表,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]).但是我不知道如何一下子全部三个.

编辑:
请注意,原始示例仅尝试更新一列,但我的实际数据需要更新许多列.考虑DT1b和DT2b中的其他情况:

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

原文地址:https://www.jb51.cc/mssql/81330.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐