![](/img/trans.png)
[英]R data.table Retain the first non-NA value of a group till end of the group
[英]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.