gpt4 book ai didi

r - 使用 data.table 通过多个键进行子集化的奇怪行为

转载 作者:行者123 更新时间:2023-12-01 12:20:33 25 4
gpt4 key购买 nike

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

最佳答案

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")


作为旁注,在加入之前不再需要设置 key 。相反,可以使用 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有关为什么通常不需要键控来提高连接性能的详细信息。它说:

Usually, unless there are repetitive grouping / join operations being performed on the same keyed data.table, there should not be a noticeable difference.

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

关于r - 使用 data.table 通过多个键进行子集化的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44578620/

25 4 0