我需要将数字放在组中的第一个或随机项目上。 我做了以下事情:
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而不是条件列。 我做错了什么?
答案 0 :(得分: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)]
答案 1 :(得分:1)
您的命令存在的问题是,它在原始data.table
中找到了您在[item, week]
中找到的密钥sampleDT
组合的行。由于sampleDT
包含[item, week]
的所有组合,因此您可以获得整个data.table
。
一个更简单的解决方案(我认为)将使用!duplicated()
来检索每个[item, week]
组合的第一个实例:
DT[!duplicated(DT, c("item", "week") ), newCol := 5]