2012-12-17 4 views
2

나는 (완전히 놀랍도록) data.table 패키지에 새로운 것이므로 매우 기본적인, 다소 기괴한 문제에 봉착 한 것처럼 보입니다. 내가 일하는 정확한 데이터 세트를 게시 할 수는 없지만 사과해야합니다. 문제는 분명히 분명히 밝혀 질만큼 간단하다고 생각합니다.변수를 매개 변수로 data.table에 전달하는 방법 [J()]

의 내가 키 X와, 그래서 같은 data.table 있다고 가정 해 봅시다 :

set1 
    x y 
1: 1 a 
2: 1 b 
3: 1 c 
4: 2 a 

나는 x == 1 모든 행을 포함 set1의 하위 집합을 반환합니다. 이것은 data.table에서 놀라 울 정도로 단순합니다 : set1[J(1)]. Bam. 끝난. z <- 1을 할당하고 set1[J(z)]으로 전화 할 수도 있습니다. 다시 : 훌륭한 작품.

... ~ 6M 행을 포함하는 실제 데이터 세트까지 확장하려고 할 때를 제외하고. 내가 set1[J(1674)]라고 부를 때, 나는 정확히 내가 무엇을 찾고 있는지를 78 줄로 돌려 준다. 그러나 나는 (문자 그대로)이 부분 집합 중 4M을 찾을 수 있어야합니다. 검색 할 값을 id <- 1674으로 지정하고 set1[J(id)] ... R을 호출하면 거의 내 바탕 화면이 다운됩니다.

분명히 무언가 나는 data.table 후드에서 계속 진행되고 있지만 이해할 수 없었습니다. 인터넷 검색 및 스택 오버플로를 통해 이것이 작동해야 함을 제안합니다. 순수한 whimsey에서, 나는 시도했다 :

id <- quote(1674) 
set1[J(eval(id))] 

... 그러나 그것은 훨씬 더 나쁘다. 뭐 ... 무슨 일이야?

+0

R이 출력하는 내용에 대해 좀 더 자세히 설명해 주시겠습니까? –

+0

예 아니요. 예, 자세한 내용을 제공 할 수는 있지만 R은 아무 것도 인쇄하지 않습니다 *. 'top'에 따르면 set1 [J (id)]를 호출하면 rsession이 시스템 메모리를 최대 97 %까지 사용하기 시작합니다. 이 상자는 나중에 rsession 프로세스를 죽일 때까지 기능적으로 사용할 수 없게됩니다. 이것은'set1 [J (1674)]와는 대조적으로'enter '를 누르면 78 행을 반환합니다. – Gastove

+2

id는 데이터 테이블의 열입니다. – mnel

답변

3

거의 확실히 set1 하나 개 컬럼 "id"을 호출하는 일 [I가 작성되었을 ... 그것에 날 이길 @mnel]; 즉

isTRUE("id" %in% names(set1)) 

자체에 set1[J(id)] 범위가 호출에 id 무시 set1 set1$id에 참여하게한다.

.id = <your 4M ids> 
set1[J(.id)] 

또는 하나의 이름 i가 호출 범위에서 평가된다는 사실 사용 :

JDT=J(id); set1[JDT] 

을하거나

는 그렇다면, 이와 같은 문제를 범위 지정 피하기 위해 몇 가지 방법이 있습니다 eval은 호출 범위에서 eval 'd입니다.

set1[..(J(id))]  # .. alias for eval 

혹은 : .. 파일 시스템의에서 그 의미를 빌려

set1[J(..id)] 

또는, 우리는이 명확하게, 더 강력하고 쉽게 할 않기 때문에 하나의 생각은 ..을 추가하는 것입니다 .., 1 레벨 업을 의미합니다... 심볼의 접두사 인 경우, 당신은 다음과 같이 할 수있다 : ==이 그림 거기에 사용되는

DT[colB==..id] 

. 이 예에서 colB은 열 이름이어야하고 ..id은 호출 범위 (한 수준 위)에 id을 찾을 것입니다. 생각은 프로그래머가 의도 한 코드를 독자에게 분명히 알리는 것입니다.

+0

하! 그래, 그게 다야. 매우 감사합니다! 생각 나게 명백한 것처럼 보입니다. – Gastove

관련 문제