为什么使用数字键进行子集操作在data.table中不起作用

14

我有一个包含两个数字行的表格,其中一个被设置为键。我想通过数字关键值对我的进行子集操作,但似乎不起作用。当我将其转换为字符时,它才起作用。

你能帮我理解为什么吗?我正在使用data.table 1.8.6。

非常感谢。这是测试代码:

> ID <-c(rep(210, 9), rep(3917,6))
> Count <- c(1,1,0,1,1,1,1,1,1,1,1,1,1,0,1)
> x <- data.table(ID, Count)
> 
> # numeric key doesn't work with i argument
> setkey(ID)
 [1]  210  210  210  210  210  210  210  210  210 3917 3917 3917 3917 3917 3917
> x[210,list(ID, Count)]
   ID Count
1: NA    NA
> 
> # create character key
> x$charID <- as.character(x$ID)
> setkey(x, charID)
> x["210",list(ID, Count)]
   charID  ID Count
1:    210 210     1
2:    210 210     1
3:    210 210     0
4:    210 210     1
5:    210 210     1
6:    210 210     1
7:    210 210     1
8:    210 210     1
9:    210 210     1

ID是数字还是因子? - Ricardo Saporta
2个回答

18

您需要在data.table中发送数字键。使用 J 很容易实现这一点。或者将其放入一个列表中。

请注意,在设置键时,需要指定 data.table ,例如:

setkey(x, ID)
x[J(210)]
    ID Count
1: 210     1
2: 210     1
3: 210     0
4: 210     1
5: 210     1
6: 210     1
7: 210     1
8: 210     1
9: 210     1
x[list(210)]
    ID Count
1: 210     1
2: 210     1
3: 210     0
4: 210     1
5: 210     1
6: 210     1
7: 210     1
8: 210     1
9: 210     1

不确定为什么会这样 - 我有一个带有负值的数字键。我尝试使用语法J(-1),但它不起作用,但是list(-1)却可以工作。也许对某些人有用 :) - Meep

5
当你请求 R 语言中的 x[210, ] 时,它会寻找 x 中的第 210 行。
如果 x 中有超过 210 行,则返回该值(虽然不是您想要的行)。由于没有第 210 行,它会返回 NA。
当你请求 x['210', ] 时,它会寻找 x 中标记为 '210' 的行。
尝试以下代码以查看差异:
 vec <- LETTERS[1:9]
 names(vec) <- c(11:18, 1)

现在进行比较:
 vec[[11]]
 vec[['11']]


 vec[[1]]
 vec[['1']]

谢谢你的解释,Ricardo。你能告诉我如何让它工作吗?如果我仍然使用数字键“ID”,那么就会出现类型不匹配的问题。 - AdamNYC
我认为这可能会执行向量搜索,而这不是我想要的。实际上,我在这里使用data.table是因为我想要使用它的二进制搜索功能。 - AdamNYC
1
有道理。你不想简单地使用 x$id <- as.character(x$id) 的原因是什么? - Ricardo Saporta
谢谢Ricardo。你的解决方案对我很有用。我经常需要设置/重置键(只是为了利用二分搜索我的大数据集)来创建新变量,所以我宁愿有一种更方便的方法来做到这一点。毕竟,我认为数字键索引的重点是使用它进行子集操作。 - AdamNYC
将键更改为字符确实使代码在所有示例中都能正常工作,但它的不一致行为令人不安。 - geneorama
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接