Подтвердить что ты не робот

Почему подмножество с числовым ключом не работает с data.table

У меня есть таблица с двумя числовыми строками, одна из которых имеет ключ. Я хотел бы подмножить свой 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
4b9b3361

Ответ 1

Вам нужно отправить числовой ключ в таблице данных. Это делается легко, используя J. Или в списке

Обратите внимание, что вам нужно указать таблицу данных при настройке ключа например,

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

Ответ 2

Когда вы задаете R для x[210, ], он ищет 210-ю строку в x.
Если 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']]