2014-05-21 2 views
1

그룹의 첫 번째 또는 임의 항목에 숫자를 입력해야합니다. 나는 다음을 수행하십시오데이터 테이블의 조건부 행에 대해서만 데이터를 입력하는 방법

item<-sample(c("a","b", "c"), 30,replace=T) 
week<-rep(c("1","2","3"),10) 
volume<-c(1:30) 
DT<-data.table(item, week,volume) 
setkeyv(DT, c("item", "week")) 

sampleDT <- DT[,.SD[1], by= list(item,week)] 
    item week volume newCol 
1: a 1  1  5 
2: a 2  14  5 
3: a 3  6  5 
4: b 1  13  5 
5: b 2  2  5 
6: b 3  9  5 
7: c 1  7  5 
8: c 2  5  5 
9: c 3  3  5 

DT[DT[,.SD[1], by= list(item,week)], newCol:=5] 

을 sampleDT 밖으로 올바른 온다,하지만 마지막 줄은 대신 조건 사람의 모든 컬럼에 5를 둔다. 내가 뭘 잘못하고 있니?

답변

1

귀하의 명령과 관련된 문제점은 원래 data.table에있는 [item, week]sampleDT에있는 키 조합을 가진 행을 찾는 것입니다. sampleDT에는 [item, week]의 모든 조합이 포함되어 있기 때문에 전체 data.table이 다시 제공됩니다.

DT[!duplicated(DT, c("item", "week")), newCol := 5] 
3

내가 대신 이렇게 할 생각 :

DT[DT[, .I[1], by = list(item, week)]$V1, newCol := 5] 

버전을

간단한 해결책은 (내가 생각하는) 각 [item, week] 조합의 첫 번째 인스턴스를 검색 할 수 !duplicated()를 사용하는 것 당신이 가진 join이 전체 data.table이되기 때문에 작동하지 않습니다.

# won't work now, but maybe in the future 
DT[, newCol[1] := 5, by = list(item, week)] 
+0

내가 R' 구문'에 대해 이런 말을 것이라고 생각하지 마십시오,하지만 두 번째 명령은 매우 휙 같습니다

또한 구문 간단하게 보류 FR있다! – MattLBeck

+0

감사합니다. $ V1은 새 열이 만들어진 것처럼 보입니다. – user1555785

+1

@ user1555785'DT [, .I [1], by = list (item, week)]'의 출력을보고'$ V1' 부분이 깨끗해야합니다 – eddi

관련 문제