2013-01-07 12 views
2

안녕하세요 여러분과 새해 복 많이 받으시는 분 data.table이 (는) 각 그룹 별 선택에 따라 실행 된 업데이트를 처리 할 수 ​​있는지 궁금합니다. 업데이트 내 및 내림차순

R) a=data.table(x=c("a","a","b","b","c","c"),y=c(1,2,3,3,2,1)) 
R) a 
    x y 
1: a 1 
2: a 2 
3: b 3 
4: b 3 
5: c 2 
6: c 1 

내가 j에서 선택을해야하는 각 별 그룹 내 조건에 업데이트 할,하지만이 i 것 (선택)의 이상이면

.

R) a[,c:=ifelse(y==max(y),"yes","no"),by=x] 
R) a 
    x y c 
1: a 1 no 
2: a 2 yes 
3: b 3 yes 
4: b 3 yes 
5: c 2 yes 
6: c 1 no 

나는 DT[drop="x,y,z"]을 할 수 있도록, data.table에, 드롭 인수를받을 예정이다, 나는 그것이 훨씬 더 빨리

두 번째 질문이있을 거라고 생각 a[y==max(y),c:="yes",by=x,within.by=TRUE] 같은 옵션 뭔가를 사용하여 동일한 작업을 수행 할 수 본질적으로 DT[,':='(x=NULL,y=NULL,z=NULL)]

+0

'ifelse'를 사용하지 마십시오. 'a [, c : = y == max (y), by = x]'는 더 빠릅니다. – Roland

+0

충분하지만 2 줄이 필요합니다. – statquant

+2

두 줄은 필요 없습니다 :'a [, c : = c ("no", "yes") [(y == max (y)) + 1], by = x]'. –

답변

1

이것은 단지 추측이며 다음과 같은 주석에 따라 구성됩니다. which.max(x)x==max(x)보다 빠릅니다. ?which.max 가입일

:

which.min의 값 which.max
길이가 1 또는 0의 정수 (IFF X를 갖는 아니 비 NAS), 각각의 제 1 최소 또는 최대의 인덱스를 부여 엑스. 이 극값이 고유하거나 비어 있으면 결과는 각각 which(x == min(x)) 또는 which(x == max(x))과 동일하지만 더 효율적입니다.

그래서, 같은 아마 뭔가 : 당신이에 받고있는 무슨 수 있습니다 i를 사용

DT[,c:="no"] 
w = DT[,list(IDX=.I[which.max(y)]),by=x]$IDX 
DT[w,c:="yes"] 

. 그 결과 w은 그룹 당 하나의 항목 일 뿐이므로 그룹당 .N이 아니라 그보다 빠를 수 있습니다. which.max 그 자체 만이 아닙니다. 물론 최대 값을 묶을 수 있다면 which.max은 첫 번째 값만 반환하므로 데이터에 따라 적절하지 않을 수 있습니다.

벤치 마크를 수행하는 경우 데이터를 크게 (1GB 이상) 만들고 키순으로 비교하려면 키순으로 비교하십시오.

+0

고마워요. @ user1935457. 왜 다른 사람들이 그것을 거절했는지 확신 할 수 없지만 지금은 그것을 포함 시켰습니다. –

+0

감사합니다. 나는이 게시물에서 일을 배웠다. 끝내자. – statquant