2014-05-21 51 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中找到包含您在sampleDT中找到的鍵[item, week]的組合的行。由於sampleDT包含[item, week]的所有組合,因此您會收到全部data.table

一個簡單的解決方案(我認爲)是使用!duplicated()檢索每個[item, week]組合的第一個實例:

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

我想你想這樣做,而不是:

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

你的版本不起作用,因爲您有加入的結果全部爲data.table

也有一個未決的FR,使語法簡單:

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

從來沒有想過我會說這對'R'語法,但第二個命令看起來非常沙沙! – MattLBeck

+0

謝謝,它的工作。 $ V1看起來像新建立的列。 – user1555785

+1

@ user1555785查看DT [,.I [1],by = list(item,week)]的輸出,'$ V1'部分應該清除 – eddi

相關問題