[英]Remove rows with leading missing values in a specific column by group with data.table
我有一個像這樣的 data.table:
DT <- data.table(id = c(rep("a", 3), rep("b", 3)),
col1 = c(NA,1,2,NA,3,NA), col2 = c(NA,NA,5,NA,NA,NA))
id col1 col2
1: a NA NA
2: a 1 NA
3: a 2 5
4: b NA NA
5: b 3 NA
6: b NA NA
對於每個 id,我想使用zoo::na.trim
刪除 'col1' 中帶有前導NA
的行。 這是我期待的結果:
id col1 col2
1: a 1 NA
2: a 2 5
3: b 3 NA
4: b NA NA
這是我到目前為止所嘗試的。 這確實刪除了“col1”中的前導NA
,但它從結果中省略了“col2”:
DT[ , na.trim(col1), by = id]
id V1
1: a 1
2: a 2
3: b 3
這也不起作用:
DT[ , .SD[na.trim(col1)], by = id]
id col1 col2
1: a NA NA
2: a 1 NA
3: b NA NA
不使用zoo
-package的可能解決方案:
DT[DT[, .I[!!cumsum(!is.na(col1))], by = id]$V1]
你得到:
id col1 col2
1: a 1 NA
2: a 2 5
3: b 3 NA
4: b NA NA
這是做什么的:
DT[, .I[!!cumsum(!is.na(col1))], id]$V1
您可以創建一個rownumbers矢量來保存。 通過使用!!cumsum(!is.na(col1))
您可以確保只省略col1
缺失值。 !!cumsum(!is.na(col1))
和cumsum(!is.na(col1))!=0
。 使用!!
將所有大於零的數字轉換為TRUE
,將所有零轉換為FALSE
。 .I
不一定需要,你也可以使用: DT[DT[, !!cumsum(!is.na(col1)), by = id]$V1]
,它使用邏輯向量對data.table進行子集化。 來自評論的cummax
的兩個替代品:cummax:
# alternative 1:
DT[DT[, !!(cummax(!is.na(col1))), by = id]$V1]
# alternative 2:
DT[as.logical(DT[, cummax(!is.na(col1)), by = id]$V1)]
@jogo的另一個選擇:
DT[, .SD[!!cumsum(!is.na(col1))], by = id]
@Frank的另一個選擇:
DT[, .SD[ rleid(col1) > 1L | !is.na(col1) ], by = id]
na.trim
將與data.table一樣使用。 有關其參數的更多信息,請參閱?na.trim
。
DT[, na.trim(.SD, sides = "left", is.na = "all"), by = id]
贈送:
id col1 col2
1: a 1 NA
2: a 2 5
3: b 3 NA
4: b NA NA
添加:
在評論中,海報澄清說,只有第1列na.trim
操作。 在這種情況下,添加一列行號,.I,並在使用這些行號后使用na.trim
子集。
DT[DT[, na.trim(data.table(col1, .I), "left"), by = id]$.I, ]
我們可以使用1:.N >= which.max(...)
來子集所需的行
> DT[, .SD[1:.N >= which.max(!is.na(col1))], id]
id col1 col2
1: a 1 NA
2: a 2 5
3: b 3 NA
4: b NA NA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.