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.tablesingle
将按以下方式构造:
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