Ich habe eine data.table
mit vielen fehlenden Werten und ich möchte eine Variable, die mir eine 1 für den ersten Nicht-Missin-Wert in jeder Gruppe gibt.R: finde die erste Nicht-NA-Beobachtung in der Spalte data.table nach Gruppe
Say I haben eine so 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]
die nun Missings am Anfang, am Ende und dazwischen. Ich habe zwei Versionen ausprobiert, ist:
DT[min(which(!is.na(Petal.Width))),first_available:=1,by=Species]
aber es findet nur das globale Minimum (in diesem Fall setosa die richtigen 1 wird), nicht das Minimum von Gruppe. Ich denke, das ist der Fall, weil data.table
ersten Teilmengen von i, dann sortiert nach Gruppe, richtig? Es wird also nur mit der Zeile funktionieren, die das globale Minimum von which(!is.na(Petal.Width))
ist, was der erste Nicht-NA-Wert ist.
Ein zweiter Versuch mit dem Test in j:
DT[,first_available:= ifelse(min(which(!is.na(Petal.Width))),1,0),by=Species]
die nur eine Spalte von 1s zurückgibt. Hier habe ich keine gute Erklärung, warum es nicht funktioniert.
mein Ziel ist es dies:
DT[,first_available:=0]
DT[c(11,71,135),first_available:=1]
aber in Wirklichkeit Ich habe Hunderte von Gruppen. Jede Hilfe wäre willkommen!
Edit: this Frage kommt nahe, aber ist nicht auf NA ausgerichtet und löst das Problem hier nicht, wenn ich es richtig verstehe. Ich habe versucht:
DT <- data.table(DT, key = c('Species'))
DT[unique(DT[,key(DT), with = FALSE]), mult = 'first']
Mögliche doppelte o f [R: erste Beobachtung nach Gruppe mit data.table & self-join] (http://stackoverflow.com/questions/15776064/r-first-observation-by-group-using-data-table-self-join) – mtoto
siehe bearbeiten, ich bin mir nicht sicher –