在 data.table 的 i 中使用匹配项
Use of match within i of data.table
%in%
运算符是匹配函数返回 "a vector of the same length as x" 的包装器。例如:
> match(c("a", "b", "c"), c("a", "a"), nomatch = 0) > 0
## [1] TRUE FALSE FALSE
在 data.table 的 i
范围内使用时,但是
(dt1 <- data.table(v1 = c("a", "b", "c"), v2 = "dt1"))
v1 v2
1: a dt1
2: b dt1
3: c dt1
(dt2 <- data.table(v1 = c("a", "a"), v2 = "dt2"))
v1 v2
1: a dt2
2: a dt2
dt1[v1 %in% dt2$v1]
v1 v2
1: a dt1
2: a dt1
获得重复项。 data.table 的 i
中 %in%
的预期行为是否应该给出与
相同的结果
dt1[dt1$v1 %in% dt2$v1]
v1 v2
1: a dt1
即没有重复?
这是 data.table
V < 1.9.5 自动索引中的错误,已在 V >= 1.9.5 中修复。
我可以想到 3 种可能的解决方法:
禁用自动索引并使用基础 R %in%
,如
options(datatable.auto.index = FALSE)
dt1[v1 %in% dt2$v1]
## v1 v2
## 1: a dt1
使用内置的 %chin%
运算符,它既高效又没有此错误(仅适用于字符向量比较)
dt1[v1 %chin% dt2$v1]
## v1 v2
## 1: a dt1
从 Github 安装开发版本(先关闭所有 R 会话,然后只重新打开一个)
library(devtools)
install_github("Rdatatable/data.table", build_vignettes = FALSE)
library(data.table)
dt1 <- data.table(v1 = c("a", "b", "c"), v2 = "dt1")
dt2 <- data.table(v1 = c("a", "a"), v2 = "dt2")
dt1[v1 %in% dt2$v1]
## v1 v2
## 1: a dt1
%in%
运算符是匹配函数返回 "a vector of the same length as x" 的包装器。例如:
> match(c("a", "b", "c"), c("a", "a"), nomatch = 0) > 0
## [1] TRUE FALSE FALSE
在 data.table 的 i
范围内使用时,但是
(dt1 <- data.table(v1 = c("a", "b", "c"), v2 = "dt1"))
v1 v2
1: a dt1
2: b dt1
3: c dt1
(dt2 <- data.table(v1 = c("a", "a"), v2 = "dt2"))
v1 v2
1: a dt2
2: a dt2
dt1[v1 %in% dt2$v1]
v1 v2
1: a dt1
2: a dt1
获得重复项。 data.table 的 i
中 %in%
的预期行为是否应该给出与
dt1[dt1$v1 %in% dt2$v1]
v1 v2
1: a dt1
即没有重复?
这是 data.table
V < 1.9.5 自动索引中的错误,已在 V >= 1.9.5 中修复。
我可以想到 3 种可能的解决方法:
禁用自动索引并使用基础 R
%in%
,如options(datatable.auto.index = FALSE) dt1[v1 %in% dt2$v1] ## v1 v2 ## 1: a dt1
使用内置的
%chin%
运算符,它既高效又没有此错误(仅适用于字符向量比较)dt1[v1 %chin% dt2$v1] ## v1 v2 ## 1: a dt1
从 Github 安装开发版本(先关闭所有 R 会话,然后只重新打开一个)
library(devtools) install_github("Rdatatable/data.table", build_vignettes = FALSE) library(data.table) dt1 <- data.table(v1 = c("a", "b", "c"), v2 = "dt1") dt2 <- data.table(v1 = c("a", "a"), v2 = "dt2") dt1[v1 %in% dt2$v1] ## v1 v2 ## 1: a dt1