为什么使用数字键进行子集化不适用于data.table

时间:2012-12-02 04:02:33

标签: r data.table

我有一个包含两个数字行的表,其中一行设置为key。我想通过数字键值对data.table进行子集化,但它似乎不起作用。当我将它转换为角色时,它会起作用。

你可以帮我理解为什么会这样吗?我正在使用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

2 个答案:

答案 0 :(得分:17)

您需要在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

答案 1 :(得分: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']]