2012-01-18 3 views
4

Я использую data.table довольно много. Он работает хорошо, но я нахожу, что мне требуется много времени, чтобы перевести мой синтаксис, чтобы он воспользовался бинарным поиском.В R с использованием data.table, как исключить строки и как включить значения NA в целочисленном столбце

В следующей таблице данных, как бы 1 выбрать все строки, в том числе, где значение СРТ NA но исключает строки, где значение СРТ 23456 или 10000.

cpt <- c(23456,23456,10000,44555,44555,NA) 
description <- c("tonsillectomy","tonsillectomy in >12 year old","brain transplant","castration","orchidectomy","miscellaneous procedure") 
cpt.desc <- data.table(cpt,description) 

setkey(cpt.desc,cpt) 

Следующая строка работает, но я думаю, он использует метод векторного сканирования вместо двоичного поиска (или двоичного исключения). Есть ли способ сбросить строки с помощью двоичных методов?

cpt.desc[!cpt %in% c(23456,10000),] 

ответ

2

Только частичный ответ, потому что я новичок в data.table. Самосоединение работает для числа, но то же самое не подходит для строк. Я уверен, что один из профессиональных таблиц данных знает, что делать.

library(data.table) 

n <- 1000000 
cpt.desc <- data.table(
    cpt=rep(c(23456,23456,10000,44555,44555,NA),n), 
    description=rep(c("tonsillectomy","tonsillectomy in >12 year old","brain transplant","castration","orchidectomy","miscellaneous procedure"),n)) 

# Added on revision. Not very elegant, though. Faster by factor of 3 
# but probably better scaling 
setkey(cpt.desc,cpt) 
system.time(a<-cpt.desc[-cpt.desc[J(23456,45555),which=TRUE]]) 
system.time(b<-cpt.desc[!(cpt %in% c(23456,45555))]) 
str(a) 
str(b) 

identical(as.data.frame(a),as.data.frame(b)) 

# A self-join works Ok with numbers 
setkey(cpt.desc,cpt) 
system.time(a<-cpt.desc[cpt %in% c(23456,45555),]) 
system.time(b<-cpt.desc[J(23456,45555)]) 
str(a) 
str(b) 

identical(as.data.frame(a),as.data.frame(b)[,-3]) 

# But the same failes with characters 
setkey(cpt.desc,description) 
system.time(a<-cpt.desc[description %in% c("castration","orchidectomy"),]) 
system.time(b<-cpt.desc[J("castration","orchidectomy"),]) 
identical(as.data.frame(a),as.data.frame(b)[,-3]) 

str(a) 
str(b) 
+0

Ваш код выбирает определенные значения. Однако я пытаюсь выбрать против (или исключать или удалять) строки с определенными значениями. – Farrel

+0

Попробуйте отредактированную версию. –

+0

Все еще есть проблемы с вашим кодом. Когда вы настраиваете таблицу данных, вы использовали 44555 в качестве значения, но я уверен, что в последующих строках вы сделали опечатку, потому что вы использовали 45555. Кроме того, если вы хотите использовать функцию ИЛИ в команде J, вы не можете использовать 'J (сначала значение, второе значение) ', так как это будет искать первое значение в первом ключе и второе значение во втором ключе. Вместо этого вы должны использовать 'J (c (первое значение, второе значение))'. Проверьте это и посмотрите, согласны ли вы. После этого я снова посмотрю. Я заинтригован вашей техникой. – Farrel

Смежные вопросы