如何仅在数据表上输入条件行的数据

时间:2014-05-21 16:19:23

标签: r data.table

我需要将数字放在组中的第一个或随机项目上。 我做了以下事情:

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而不是条件列。 我做错了什么?

2 个答案:

答案 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]