我有一个 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]
它只返回一列 1。在这里,我没有很好的解释为什么它不起作用。
我的目标是:
DT[,first_available:=0]
DT[c(11,71,135),first_available:=1]
但实际上我有数百个组。任何帮助,将不胜感激!
编辑:this问题确实接近,但不是针对 NA 的,如果我理解正确,也不能解决这里的问题。我试过:
DT <- data.table(DT, key = c('Species'))
DT[unique(DT[,key(DT), with = FALSE]), mult = 'first']
最佳答案
这是一种方法:
DT[!is.na(Petal.Width), first := as.integer(seq_len(.N) == 1L), by = Species]
关于R:按组在 data.table 列中找到第一个非 NA 观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37723943/