R:data.table,将组的第一个和最后一个值设置为NA

R:data.table,将组的第一个和最后一个值设置为NA,r,data.table,R,Data.table,我想将组中的第一个和最后一个值设置为NA。以下是一个例子: DT <- data.table(v = rnorm(12), class=rep(1:3, each=4)) DT[, v[c(1,.N)] := NA , by=class] DT使用辅助函数很容易 set.na = function(x,y) {x[y] = NA; x} DT[, set.na(v,c(1,.N)) , by=class] 修改数据子集的标准方法是使用i定义子集。您不能将[与:=一起使用。按照@Davi

我想将组中的第一个和最后一个值设置为NA。以下是一个例子:

DT <- data.table(v = rnorm(12), class=rep(1:3, each=4))
DT[, v[c(1,.N)] := NA , by=class]

DT使用辅助函数很容易

set.na = function(x,y) {x[y] = NA; x}
DT[, set.na(v,c(1,.N)) , by=class]

修改数据子集的标准方法是使用
i
定义子集。您不能将
[
:=
一起使用。按照@David Arenburg的建议创建一个临时
i
,或者您可以使用
c(NA,v[-c(1,N)],NA)构造自己创建结果向量

DT[, v := c(NA, v[-c(1, .N)], NA)[1:.N], by = class]

但是,您还应该注意,当您设置一个新键或使用任意数量的函数时,行顺序可能会发生变化。因此,您应该非常小心进行此操作。

目前,解决此问题的方法是首先提取索引,然后通过引用执行一个赋值

idx = DT[, .(idx = .I[c(1L, .N)]), by=class]$idx
DT[idx, v := NA]

我将尝试将此示例添加到vignette中。

这可能不是一行,但它在代码中有“first”和“last”:

>DT设置键(DT,类)
>类别=DT[,(唯一(类别))]
>DT[classes,v:=NA,mult='first']
>DT[classes,v:=NA,mult='last']
>DT
v级
1:NA 1
2: -1.8191     1
3: -0.6355     1
4:NA 1
5:NA 2
6: -1.1771     2
7: -0.8125     2
8:NA 2
9:NA 3
10:  0.2357     3
11:  0.3416     3
12:NA 3
> 

非键列也保留了顺序。我认为这是一个有文档记录的(已提交的)功能。

第二个命令可以用类似
set(DT,j=“v”,I=idx,value=NA)的东西来完成。
,对吗?你比我更清楚这是否更快。@Frank,如果你反复这么做,是
set()
会更快,因为它没有
[.data.table
的开销,在这里不重要。
> DT <- data.table(v = rnorm(12), class=rep(1:3, each=4))
> setkey(DT, class)
> classes = DT[, .(unique(class))]
> DT[classes, v := NA, mult='first']
> DT[classes, v := NA, mult='last']
> DT
          v class
 1:      NA     1
 2: -1.8191     1
 3: -0.6355     1
 4:      NA     1
 5:      NA     2
 6: -1.1771     2
 7: -0.8125     2
 8:      NA     2
 9:      NA     3
10:  0.2357     3
11:  0.3416     3
12:      NA     3
>