我有一个包含许多缺失值的 data.table
,我想要一个变量,在每个组中给出第一个非缺失值的1。
假设我有以下这样的 data.table
:
library(data.table)
DT <- data.table(iris)[,.(Petal.Width,Species)]
DT[c(1:10,15,45:50,51:70,101:134),Petal.Width:=NA]
现在这段文本开头、结尾和中间都缺失了一些内容。我尝试过两个版本,其中一个是:
DT[min(which(!is.na(Petal.Width))),first_available:=1,by=Species]
但它只能找到全局最小值(在本例中,setosa获得了正确的1),而不是每组的最小值。我认为这是因为data.table
首先按i子集,然后按组排序,对吗?因此,它仅适用于which(!is.na(Petal.Width))
的全局最小行,即第一个非NA值。
第二次尝试使用j中的测试:
DT[,first_available:= ifelse(min(which(!is.na(Petal.Width))),1,0),by=Species]
这里是返回一个列的1s。但是,我没有一个好的解释为什么它不起作用。
我的目标是:
DT[,first_available:=0]
DT[c(11,71,135),first_available:=1]
但实际上我有数百个组。任何帮助都将不胜感激!
编辑:这个问题接近,但不针对NA,并且如果我理解正确,它无法解决此处的问题。我尝试过:
DT <- data.table(DT, key = c('Species'))
DT[unique(DT[,key(DT), with = FALSE]), mult = 'first']