给出两个数据框:
df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)))
df2 = data.frame(CustomerId = c(2, 4, 6), State = c(rep("Alabama", 2), rep("Ohio", 1)))
df1
# CustomerId Product
# 1 Toaster
# 2 Toaster
# 3 Toaster
# 4 Radio
# 5 Radio
# 6 Radio
df2
# CustomerId State
# 2 Alabama
# 4 Alabama
# 6 Ohio
Run Code Online (Sandbox Code Playgroud)
我怎样才能做数据库风格,即sql风格,加入?也就是说,我该怎么做:
假设我有两个data.table:
A:
A B
1: 1 12
2: 2 13
3: 3 14
4: 4 15
Run Code Online (Sandbox Code Playgroud)
B:
A B
1: 2 13
2: 3 14
Run Code Online (Sandbox Code Playgroud)
我有以下代码:
merge_test = merge(dataA, dataB, by="A", all.data=TRUE)
Run Code Online (Sandbox Code Playgroud)
我明白了:
A B.x B.y
1: 2 13 13
2: 3 14 14
Run Code Online (Sandbox Code Playgroud)
但是,我想在最终合并表中的dataA中的所有行.有没有办法做到这一点?
我有两个data.tables,X(3米行乘500列)和Y(100行乘两列).
set.seed(1)
X <- data.table( a=letters, b=letters, c=letters, g=sample(c(1:5,7),length(letters),replace=TRUE), key="g" )
Y <- data.table( z=runif(6), g=1:6, key="g" )
Run Code Online (Sandbox Code Playgroud)
我想在X上做一个左外连接,我可以做到Y[X]这一点,感谢:
为什么X [Y]连接data.tables不允许完全外连接或左连接?
但我想在X 不复制的情况下添加新列X(因为它很大).
显然,像X <- Y[X]作品这样的东西,但除非data.table比我给它的功劳更加明确(并且我非常狡猾地给予它赞美!),我相信这复制了整个X.
X[ , z:= Y[X,z]$z ] 虽然工作正常,但却不能很好地扩展到多个列.
如何将合并的结果以有效的方式(在副本方面和程序员时间方面)存储回保留的data.table中?
只是想知道是否有一种有效的方法来与数据表进行外连接,例如
a <- data.table(a=c(1,2,3),b=c(3,4,5))
b <- data.table(a=c(1,2),k=c(1,2))
merge(a,b,by="a",all.x=T)
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但它没有内部连接那么高效,因为下面的运行速度非常快,但上面的速度非常慢.
setkey(a,a)
setkey(b,a)
a[b,]
Run Code Online (Sandbox Code Playgroud) 这是我的数据框:
X Y Date Qty CumSumA CumSumB
1 A B 1/1 1 1 0
2 A A 1/1 2 3 2
3 A E 1/1 2 5 2
4 B A 1/1 1 1 1
5 B B 1/1 3 4 4
6 B C 1/1 2 6 4
7 C D 1/1 2 2 2
8 C E 1/1 4 6 2
9 C A 1/1 1 7 2
10 A C 1/2 2 2 0
11 A D …Run Code Online (Sandbox Code Playgroud) 我有两组数据。
样本set_A(总行数:45467):
ID_a a1 a2 a3 time_a
2 35694 5245.2 301.6053 00.00944
3 85694 9278.9 301.6051 23.00972
4 65694 9375.2 301.6049 22.00972
5 85653 4375.5 301.6047 19.00972
6 12694 5236.3 301.6045 22.00972
7 85697 5345.2 301.6043 21.00972
8 85640 5274.1 301.6041 20.01000
9 30694 5279.0 301.6039 20.01000
Run Code Online (Sandbox Code Playgroud)
样本set_B(总行数:4798):
ID_b b1 b2 source time_b
2 34.20 15.114 set1.csv.1 20.35750
7 67.20 16.114 set1.csv.2 21.35778
12 12.20 33.114 set1.csv.3 22.35806
17 73.20 67.114 set2.csv.1 23.35833
23 88.20 42.114 …Run Code Online (Sandbox Code Playgroud) 如何有效地合并两个data.tables与全外连接,同时处理左侧和右侧滚动最后一次观察前进(LOCF)的缺失值?
现实世界中的应用 -有两个不一定交织交易规则信号表X,Y,控股(稀疏的一段时间内)的信号值.总体目标是定义复合信号,其中Signal.z = Signal.x AND Signal.y
X <- data.table(Instrument=rep("SPX",3)
, Date=as.IDate(c("2013-11-20","2013-11-22","2013-11-24"))
, Signal=c(TRUE,FALSE,TRUE), key=c("Instrument", "Date"))
Y <- data.table(Instrument=rep("SPX",3)
, Date=as.IDate(c("2013-11-21","2013-11-23","2013-11-25"))
, Signal=c(FALSE,TRUE,FALSE), key=c("Instrument", "Date"))
Run Code Online (Sandbox Code Playgroud)
期望的结果:
Instrument Date Signal.x Signal.y Signal.z
1: SPX 2013-11-20 TRUE NA NA
2: SPX 2013-11-21 TRUE FALSE FALSE
3: SPX 2013-11-22 FALSE FALSE FALSE
4: SPX 2013-11-23 FALSE TRUE FALSE
5: SPX 2013-11-24 TRUE TRUE TRUE
6: SPX 2013-11-25 TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)