我正在尝试连接两个data.tables,就像我将merge()与all = TRUE连接数据框一样,如下所示:
> x = data.frame(index = 1:10)
> y = data.frame(index = c(2,4,6), weight = c(0.2, 0.3, 0.5))
> x
index
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
> y
index weight
1 2 0.2
2 4 0.3
3 6 0.5
> merge(x,y, all=TRUE)
index weight
1 1 NA
2 2 0.2
3 3 NA
4 4 0.3
5 5 NA
6 6 0.5
7 7 NA
8 8 NA
9 9 NA
10 10 NA
我有两个数据表,matched.weights和casted,这是一个强制转换函数的结果。他们的钥匙都是“索引”。
> matched.weights
index
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
[7,] 7
[8,] 8
[9,] 9
[10,] 10
First 10 rows of 14708 printed.
> casted
index 1 2
[1,] 10002 0.0049024578 3.057794e-03
[2,] 10129 0.0011064567 8.481497e-04
[3,] 10171 0.0012964050 5.540875e-03
[4,] 10177 0.0008181397 6.981567e-04
[5,] 10187 0.0060350971 2.156695e-03
[6,] 1022 0.0011320117 8.665125e-04
[7,] 10250 0.0047892924 7.725221e-03
[8,] 10262 0.0044724898 8.787161e-06
[9,] 10286 0.0016650838 7.162887e-05
[10,] 10299 0.0015840791 5.578903e-03
First 10 rows of 305 printed.
当我尝试合并它时出现此错误:
> merge(matched.weights, casted, all=TRUE)
Error in setcolorder(dt, c(setdiff(names(dt), end), end)) :
neworder is length 5 but x has 3 columns.
当我使用data.table语法时,它将NA替换为数据条目:
> merged = casted[matched.weights]
> merged
index X1 X2
[1,] 1 NA NA
[2,] 2 NA NA
[3,] 3 NA NA
[4,] 4 NA NA
[5,] 5 NA NA
[6,] 6 NA NA
[7,] 7 NA NA
[8,] 8 NA NA
[9,] 9 NA NA
[10,] 10 NA NA
First 10 rows of 14708 printed.
> merged[10002]
index X1 X2
[1,] 10002 NA NA
> sum(merged[[2]], na.rm=T)
[1] 0
任何人都可以向我解释发生了什么事吗?
答案 0 :(得分:1)
如果您想要merge
两个数据表(在完全外部联接的意义上,类似于all=TRUE
),您需要使用merge.data.table
:
library(data.table)
dtx <- data.table(x, key="index")
dty <- data.table(y, key="index")
merge(dtx,dty, all=TRUE)
index weight
1 1 NA
2 2 0.2
3 3 NA
4 4 0.3
5 5 NA
6 6 0.5
7 7 NA
8 8 NA
9 9 NA
10 10 NA
这与使用数据框时的结果相同(但速度要快得多)。
值得注意的是,在merge
的最新版本中,某些data.table
功能得到了改进,因此请务必获取最新的稳定版本。我使用的是1.8.0版本。