【问题标题】:Strange behaviour subsetting by multiple keys using data.table使用 data.table 的多个键的奇怪行为子集
【发布时间】:2017-11-18 14:29:30
【问题描述】:

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

【问题讨论】:

  • 好问题。添加nomatch=0,如dt[.(unique(colA),"A"), nomatch=0]。这包含在密钥小插图中:browseVignettes("data.table") 或查看网站:github.com/Rdatatable/data.table/wiki/Getting-started 啊,我看到你已经链接到那里了。
  • 非常感谢弗兰克。那行得通,如果您提交,我会接受答案。我很想知道为什么教程的航班数据不需要这样做。
  • 当然,您能否更具体地说明您所说的“不需要”是什么意思?
  • 不需要我的意思是flights[.(unique(origin), "MIA")] 没有返回 NA 列,但我意识到这一定是因为没有匹配的组合。再次感谢。

标签: r data.table


【解决方案1】:

DT[i] 将在DT 的行中查找i 的每一行。默认情况下,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,详细了解为什么通常不需要键控来提高连接性能。它说:

通常,除非在同一个 keyed data.table 上执行重复的分组/连接操作,否则应该不会有明显的差异。

我通常只在交互连接时设置键,所以我可以跳过输入on=

【讨论】:

    猜你喜欢
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2019-02-09
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多