I have a table with two numeric rows, one of which is set to key. I would like to subset my data.table
by numeric key value, but it doesn't seem to work. When I convert it to character, it works.
Could you help me to understand why is that? I am using data.table 1.8.6.
Thanks a bunch. Here is the test code:
> 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
You need to send the numeric key within a data.table. This is done easily using J
. Or in a list
Note that you need to specify the data.table when setting the key eg
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
or
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
When you ask R for x[210, ]
it is looking for the 210th row in x
.
If x
had 210+ rows, it would return that value (albeit not the row you were intending). Since there is no 210th row, it gives you NA.
When you instead ask for x['210', ]
, it is looking for the row in x
labeled '210'
Try this to see the differences:
vec <- LETTERS[1:9]
names(vec) <- c(11:18, 1)
Now compare:
vec[[11]]
vec[['11']]
vec[[1]]
vec[['1']]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With