我在data.table中设置了多个键,但是当我尝试按键的多个值选择行时,它似乎为每个可能的组合返回一行,但对于不存在的行填充NA
我可以在this document的1c中获取示例代码,因此它必须是我没有看到的东西。任何帮助将不胜感激。
library(data.table)
dt = data.table(colA = 1:4,
colB = c("A","A","B","B"),
colC = 11:14)
setkey(dt,colA,colB)
print(dt)
# colA colB colC
# 1: 1 A 11
# 2: 2 A 12
# 3: 3 B 13
# 4: 4 B 14
print(
dt[.(2,"A")]
)
# As expected
# colA colB colC
# 1: 2 A 12
print(
dt[.(c(2,3),"A")]
)
# colA colB colC
# 1: 2 A 12
# 2: 3 A NA #Unexpected
print(
dt[.(unique(colA),"A")]
)
# colA colB colC
# 1: 1 A 11
# 2: 2 A 12
# 3: 3 A NA #Unexpected
# 4: 4 A NA #Unexpected
答案 0 :(得分:4)
DT[i]
会在i
行中查找DT
的每一行。默认情况下,i
的不匹配行显示为NA
。要删除不匹配的行,请使用nomatch = 0
:
dt[.(unique(colA),"A"), nomatch=0]
# colA colB colC
# 1: 1 A 11
# 2: 2 A 12
nomatch
参数包含在OP链接的插图中。要查找最新版本的插图,请使用browseVignettes("data.table")
。
作为旁注,在加入之前不必设置密钥。相反,可以使用on=
:
library(data.table)
dt2 = data.table(colA = 1:4,
colB = c("A","A","B","B"),
colC = 11:14)
dt2[.(unique(colA),"A"), on=.(colA, colB), nomatch=0]
# colA colB colC
# 1: 1 A 11
# 2: 2 A 12
有关为什么通常不需要键入来提高连接性能的详细信息,请参阅Arun's answer。它说:
通常,除非在相同的键控 data.table上执行重复的分组/连接操作,否则不会有明显的差异。
我通常只在交互式加入时才设置键,所以我可以跳过键入on=
。