R:逐个列地在data.table中找到第一个非NA观察值

Pet*_*Pan 3 r data.table

我有一个data.table有很多缺失值,我想要一个变量,它给我一个1作为每组中的第一个非missin值.

说我有这样的数据.表:

library(data.table)
DT <- data.table(iris)[,.(Petal.Width,Species)]
DT[c(1:10,15,45:50,51:70,101:134),Petal.Width:=NA]
Run Code Online (Sandbox Code Playgroud)

现在在开头,结尾和中间都有缺失.我试过两个版本,一个是:

DT[min(which(!is.na(Petal.Width))),first_available:=1,by=Species]
Run Code Online (Sandbox Code Playgroud)

但它只能找到全局最小值(在这种情况下,setosa得到正确的1),而不是组的最小值.我认为情况就是这样,因为data.tablei的第一个子集,然后按组排序,是否正确?因此它只适用于全局最小值which(!is.na(Petal.Width))为第一个非NA值的行.

j中测试的第二次尝试:

DT[,first_available:= ifelse(min(which(!is.na(Petal.Width))),1,0),by=Species]
Run Code Online (Sandbox Code Playgroud)

它只返回一列1.在这里,我没有很好的解释为什么它不起作用.

我的目标是:

DT[,first_available:=0]
DT[c(11,71,135),first_available:=1]
Run Code Online (Sandbox Code Playgroud)

但实际上我有数百个团体.任何帮助,将不胜感激!

编辑:这个问题确实接近但不是针对NA的,如果我理解正确的话,并没有解决这个问题.我试过了:

DT <- data.table(DT, key = c('Species'))
DT[unique(DT[,key(DT), with = FALSE]), mult = 'first']
Run Code Online (Sandbox Code Playgroud)

Aru*_*run 6

这是一种方式:

DT[!is.na(Petal.Width), first := as.integer(seq_len(.N) == 1L), by = Species]
Run Code Online (Sandbox Code Playgroud)

  • `.N` 是一个特殊符号,用于保存每个组的观察数。而 `seq_len` 构造了一个从 1 到 .N 的序列。对于`.N` 和其他特殊符号,请参见`?data.table`,更多信息请参见`?seq_len`。 (2认同)