使用data.table通过多个键进行奇数行为子集化

时间:2017-06-15 23:40:26

标签: r data.table

我在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

1 个答案:

答案 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=