R Data.table:连接a";“长格式”;具有单个时间点表的多时间点表

R Data.table:连接a";“长格式”;具有单个时间点表的多时间点表,r,data.table,R,Data.table,假设我有以下两个数据表: mult.year <- data.table(id=c(1,1,1,2,2,2,3,3,3), time=rep(1:3, 3), A=rnorm(9), B=rnorm(9)) setkey(mult.year, id) single <- data.table(id=c(1,2,3),

假设我有以下两个
数据表:

mult.year <- data.table(id=c(1,1,1,2,2,2,3,3,3), 
                        time=rep(1:3, 3),
                        A=rnorm(9),
                        B=rnorm(9))
setkey(mult.year, id)
single <- data.table(id=c(1,2,3), 
                     C.3=rnorm(3))
setkey(single, id)
但是我失去了
join
功能:它要求所有
id
都在两个数据集中。在维护连接功能的同时,是否有办法做到这一点

通过以上表格,我试图得出以下结论:

   id time          A          B        C.3
1:  1    1 -1.0460085  0.0896452         NA
2:  1    2  0.2054772  1.5631978         NA
3:  1    3 -1.7574449  0.5661457  0.6495645
4:  2    1  0.4171095 -0.2182779         NA
5:  2    2 -0.9238671  0.8263605         NA
6:  2    3 -0.5452715 -0.5842541 -1.5233764
7:  3    1  0.1793009  1.4399366         NA
8:  3    2  0.3438980  1.7419869         NA
9:  3    3  0.1067989  0.7630496  1.9658157

如果您愿意在数据表的键中包含
时间
,则可以执行以下操作:

## Add time ...
setkeyv(mult.year, c("id", "time"))                     ## ... to mult.year's key
single <- data.table(id=c(1,2,3), time=3, C.3=rnorm(3)) ## ... and to indexing dt

## Which will set up a simple call to [.data.table
mult.year[single, C.3:=C.3]
mult.year
#    id time          A           B         C.3
# 1:  1    1 -0.6264538 -0.30538839          NA
# 2:  1    2  0.1836433  1.51178117          NA
# 3:  1    3 -0.8356286  0.38984324  0.61982575
# 4:  2    1  1.5952808 -0.62124058          NA
# 5:  2    2  0.3295078 -2.21469989          NA
# 6:  2    3 -0.8204684  1.12493092 -0.05612874
# 7:  3    1  0.4874291 -0.04493361          NA
# 8:  3    2  0.7383247 -0.01619026          NA
# 9:  3    3  0.5757814  0.94383621 -0.15579551

一个更有效的解决方案是考虑连接类型(sql风格,请阅读此处以供参考,因为它极大地帮助我利用了
数据.table
功能;然后,看看
数据.table
常见问题解答(第2.16点)如何实现所需的连接)

那么,实际上,您想要的是data.table
single
将按以下方式构造:

single <- data.table(id=c(1,2,3),time=3,C.3=rnorm(3))
给你想要的。这种方法更加清晰有效。作为比较:

> system.time(mult.year[single, C.3:=C.3])
user  system elapsed 
0.02    0.00    0.01
虽然我的方法产生了:

> system.time(mult.year<-single[mult.year])
user  system elapsed 
0       0       0 

“C.3仅在
时间==3时出现”是什么意思。一个
mult.year[time==3][single]
mult.year[single,C.3:=ifelse(time==3,C.3,NA)]
可能就足够了,但你的问题不清楚我要找的是哪一个,我会添加一些预期的输出。请你展示一下你给
single的键,并打印出你在做
single时得到的结果[mult.year]
?当我运行它时(在第一次为
single
提供钥匙后,因为没有钥匙它根本不工作),它给出的结果与OP要求的结果不匹配…请参阅我的编辑。抱歉出错。我忘了提到我设置的键。太好了,谢谢。这看起来不错,不过如果您在帖子的早期显示可复制的代码,包括您需要设置的键,其他人可能会更容易理解。
mult.year<-single[mult.year]
> system.time(mult.year[single, C.3:=C.3])
user  system elapsed 
0.02    0.00    0.01
> system.time(mult.year<-single[mult.year])
user  system elapsed 
0       0       0 
mult.year <- data.table(id=...,time=...,A=...,B=...,key=c("id","time"))
single <- data.table(id=...,time=3 ,C.3=...,key=c("id","time"))
> print(mult.year)
   id time        C.3           A          B
1:  1    1         NA  0.02556433 -0.4525380
2:  1    2         NA  0.37282039 -1.5151395
3:  1    3  0.1769263 -1.48347426  0.5536820
4:  2    1         NA  0.85327700 -0.4924897
5:  2    2         NA -1.10516056  0.8360339
6:  2    3 -0.3698935  1.45610643 -0.9189147
7:  3    1         NA -0.53218378 -0.6740748
8:  3    2         NA  0.34124242 -1.1458312
9:  3    3 -1.3997742  0.32009017  0.4333386