我正在尝试使用 na.trim
来自包裹 zoo
在 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
我想用 删除行领先 NA 使用
na.trim
并按 id 分组。这是我期待的结果: id col1 col2
1: a 1 NA
2: a 2 5
3: b 3 NA
4: b NA NA
这是我迄今为止尝试过的。这会删除前导 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
的可能解决方案-包裹:
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
您创建一个要保留的行号向量。通过使用 !!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
@lmo 来自评论:# 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]
关于r - na.trim 在特定列上使用 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025738/