R 为什么data.table的内部连接行为不同?

R 为什么data.table的内部连接行为不同?,r,inner-join,data.table,dplyr,R,Inner Join,Data.table,Dplyr,我想使用dplyr函数internal\u join()将数据帧与数据表连接起来。这是我的密码 library(data.table) library(dplyr) DF <- data.frame(x = rep( c("a","b","c"), each=3), y = rep( c(1,3,6), 3)) DT <- data.table(x = rep( c("a","b","c"), each=3),

我想使用
dplyr
函数
internal\u join()
将数据帧与数据表连接起来。这是我的密码

library(data.table)
library(dplyr)

DF <- data.frame(x = rep( c("a","b","c"), each=3), 
                 y = rep( c(1,3,6), 3))

DT <- data.table(x = rep( c("a","b","c"), each=3), 
                 y = rep( c(1,3,6), 3))

W <- data.frame(x = c("b","c","d"), 
              foo = c(4,2,9))
但当我尝试将数据帧与数据表联接时,
internal\u join()
会给出意外的结果

inner_join(DT,W)

Joining by: "x"
  x y foo
1 b 1   2
2 b 3   2
3 b 6   2
4 c 1   9
5 c 3   9
6 c 6   9
谁能告诉我为什么会发生这种事?提前感谢您抽出时间

注意:我在MAC Maverick OS X 10.9.4上使用的是RStudio版本0.98.1056,
sessionInfo()

R version 3.1.1 (2014-07-10)
Platform: x86_64-apple-darwin13.1.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] dplyr_0.2        data.table_1.9.2

loaded via a namespace (and not attached):
[1] assertthat_0.1 parallel_3.1.1 plyr_1.8.1     Rcpp_0.11.2    reshape2_1.4  
[6] stringr_0.6.2  tools_3.1.1   

David提到的“因子”和“字符”列之间的关系是正确的,它仍然没有固定。但不幸的是,这是一条红鲱鱼,而不是你麻烦的根源

然而,这是因为在
dplyrv0.2
中没有
internal\u join.data.table
方法,因此它调用
internal\u join.data.frame
方法(因为
data.table
也是
data.frame

因此,当您这样做时:

inner_join(DF, W)

两者都调用相同的
dplyr的
内部联接实现

它给出不同结果的原因是
DF
W
都将
x
作为因子,
DT
x
作为字符列

通过将
DF$x
更改为字符类型,可以重现此错误:

DF$x = as.character(DF$x)
inner_join(DF, W)
# Joining by: "x"
#   x y foo
# 1 b 1   2
# 2 b 3   2
# 3 b 6   2
# 4 c 1   9
# 5 c 3   9
# 6 c 6   9

但这似乎在
dplyr

的开发版本中得到了修复,这是因为
数据表中的一个错误导致了
字符类与
因子类合并时出现错误的结果。尝试将
DT
更改为
DT谢谢@davidernburg,你的评论解决了我的问题。要明确的是,@davidernburg的评论(部分)是正确的,当
x
的键列是一个因子,而相应的
i
的列是字符时,
x[i]
返回错误的结果(这是data.table中的一个错误),这是在转移视线,与你的例子无关。相反,这是由于
dplyr
中的一个bug造成的,该bug自那时起已被修复。感谢@Arun的解释。这确实帮助我理解了@David的评论。我对
data.table
的理解是,它也是一个
data.frame
。现在,如果默认情况下
data.frame
读取文本作为因子,那么
data.table
是否应该默认执行相同的操作?或者我还遗漏了什么?大卫的评论与你的问题无关。请再读一遍答案。大卫的建议解决了我的问题。我同意他的第一条评论所指出的可能不是我问题的根源。这似乎在开发版本中得到了修复(至少现在有了一个
内部连接.data.table
)的方法)。
inner_join(DF, W)
inner_join(DT, W)
DF$x = as.character(DF$x)
inner_join(DF, W)
# Joining by: "x"
#   x y foo
# 1 b 1   2
# 2 b 3   2
# 3 b 6   2
# 4 c 1   9
# 5 c 3   9
# 6 c 6   9