在data.table中为每个组的第一行分配值

13

我希望在一个 data.table 中仅分配每个组中第一行的值。

例如(简化):我的data.tableDT,其内容如下:

x v  
1 1  
2 2  
2 3  
3 4  
3 5  
3 6 

DTkeyx
我想要处理每一组的第一行。

这个是有效的:DT[, .SD[1], by=x]

x v  
1 1  
2 2  
3 4 

现在,我想将变量v的值赋为0

但是这些方法都没有成功:

DT[, .SD[1], by=x]$v <- 0  
DT[, .SD[1], by=x]$v := 0  
DT[, .SD[1], by=x, v:=0]

我在包中搜索了R-help和任何提供的链接,但我就是无法使其工作。
那里有笔记说明这不起作用,但没有任何帮助我的示例/解决方案。

如果有任何建议,我将非常高兴。

(我非常喜欢这个包,我不想回到使用data.frame的状态...在那里我可以让它工作)

编辑:

我想要像这样的结果:

x v  
1 0  
2 0  
2 3  
3 0  
3 5  
3 6  

这不起作用:

DT[, .SD[1], by=x] <- DT[, .SD[1], by=x][, v:=0]
2个回答

8
另一种选择可能是:

其他选项包括:

 DT[,v:={v[1]<-0L;v}, by=x]
 DT
 #  x v
 #1: 1 0
 #2: 2 0
 #3: 2 3
 #4: 3 0
 #5: 3 5
 #6: 3 6

或者

 DT[DT[, .I[1], by=x]$V1, v:=0]
 DT
 #   x v
 #1: 1 0
 #2: 2 0
 #3: 2 3
 #4: 3 0
 #5: 3 5
 #6: 3 6

1
谢谢你向我展示了另一个选项!我还在学习如何使用data.table - MDS

5

通过Roland的解决方案的帮助,看起来您可以执行以下操作。它只是将零与v的所有其他分组值连接在一起,除了第一个。

DT[, v := c(0L, v[-1]), by = x]   ## must have the "L" after 0, as 0L

这导致
DT
#    x v
# 1: 1 0
# 2: 2 0
# 3: 2 3
# 4: 3 0
# 5: 3 5
# 6: 3 6

注意:代码中间部分的 j 也可以是 v := c(integer(1), v[-1])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接