2012-01-18 1 views
4

data.table을 상당히 사용하고 있습니다. 잘 작동하지만 바이너리 검색을 활용할 수 있도록 구문을 변환하는 데 오랜 시간이 걸린다는 것을 알고 있습니다. 유럽 ​​고문 방지위원회는 값이 NA입니다 포함한 모든 행을 선택하지만, CPT 값이 23456 또는 10000R에서 data.table을 사용하면 행을 제외하는 방법과 정수 열에 NA 값을 포함시키는 방법은 무엇입니까?

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) 

다음 줄입니다 행을 제외 1 얼마나 다음 데이터 테이블에서

작동하지만 난 생각 바이너리 검색 (또는 바이너리 제외) 대신 벡터 스캔 방법을 사용합니다. 이진 메서드로 행을 삭제하는 방법이 있습니까?

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 명령에서 OR 함수를 사용하려면'J (첫 번째 값, 두 번째 값)'그것은 첫 번째 키의 첫 번째 값과 두 번째 키의 두 번째 값을 찾습니다. 대신'J (c (첫 번째 값, 두 번째 값)) '을 사용해야합니다. 그것을 확인하고 동의하는지 확인하십시오. 그 후에 다시 보게 될 것입니다. 나는 당신의 기술에 흥미가 있습니다. – Farrel

관련 문제