我有一个包含两个数字行的表,其中一行设置为key。我想通过数字键值对data.table
进行子集化,但它似乎不起作用。当我将它转换为角色时,它会起作用。
非常感谢。这是测试代码:
> 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
答案 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']]