簡體   English   中英

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

[英]R: find first non-NA observation in data.table column by group

我有一個帶有許多缺失值的data.table ,我想要一個變量,它給出了每個組中第一個非data.table值的1。

說我有這樣的數據。表:

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]

但實際上我有數百個團體。 任何幫助,將不勝感激!

編輯: 這個問題確實接近但不是針對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]

我們可以嘗試

DT[DT[, .I[which.max(!is.na(Petal.Width))] , Species]$V1, 
     first_available := 1][is.na(first_available), first_available := 0]

或者是一個稍微緊湊的選項

DT[, first_available := as.integer(1:nrow(DT) %in% 
      DT[, .I[!is.na(Petal.Width)][1L], by = Species]$V1)][]
  > DT[!is.na(DT$Petal.Width) & DT$first_available == 1]
  #      Petal.Width    Species first_available
  #   1:         0.2     setosa               1
  #   2:         1.8 versicolor               1
  #   3:         1.4  virginica               1

  > rownames(DT)[!is.na(DT$Petal.Width) & DT$first_available == 1]
  # [1] "11"  "71"  "135"

  > rownames(DT)[!is.na(DT$Petal.Width) & DT$first_available == 0]
  # [1] "12"  "13"  "14"  "16"  "17"  "18"  "19"  "20"  "21"  "22"  "23"  "24" 
  # [13] "25"  "26"  "27"  "28"  "29"  "30"  "31"  "32"  "33"  "34"  "35"  "36" 
  # [25] "37"  "38"  "39"  "40"  "41"  "42"  "43"  "44"  "72"  "73"  "74"  "75" 
  # [37] "76"  "77"  "78"  "79"  "80"  "81"  "82"  "83"  "84"  "85"  "86"  "87" 
  # [49] "88"  "89"  "90"  "91"  "92"  "93"  "94"  "95"  "96"  "97"  "98"  "99" 
  # [61] "100" "136" "137" "138" "139" "140" "141" "142" "143" "144" "145" "146"
  # [73] "147" "148" "149" "150"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM