簡體   English   中英

使用 data.table 按組刪除特定列中具有前導缺失值的行

[英]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缺失值。
  • 接下來,您使用該向量來對data.table進行子集化。
  • !!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.

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