【发布时间】:2017-05-08 16:46:48
【问题描述】:
我有以下 data.table,其中有一列 NA 值和字符类型的非 NA 值
library(data.table)
dt = fread(...)
print(dt$column1)
[1] NA NA NA "1 1" "1 1" "1 1" NA NA NA NA
[11] NA "1 2" NA NA NA NA NA NA NA NA
[21] NA NA NA NA NA NA NA NA NA NA
[31] NA NA NA NA NA "1 3" NA NA NA NA
[41] NA "1 4" "1 4" NA NA NA NA NA NA NA
[51] NA NA NA NA NA NA NA NA NA NA
[61] NA NA "1 5" NA NA NA NA NA NA NA
...
我想要一个表示连续非 NA 值标签的新列,即
print(dt$groups)
[1] 0 0 0 1 1 1 0 0 0 0
[11] 0 2 0 0 0 0 0 0 0 0
[21] 0 0 0 0 0 0 0 0 0 0
[31] 0 0 0 0 0 3 0 0 0 0
[41] 0 4 4 0 0 0 0 0 0 0
[51] 0 0 0 0 0 0 0 0 0 0
[61] 0 0 5 0 0 0 0 0 0 0
...
如果我试试这个:
dt[, groups := !is.na(column1)]
这会给我一个布尔向量,带有连续的 TRUE 语句。但是,我不确定如何将其转换为连续对 TRUE 的标签。
有没有一种 data.table 方法可以做到这一点?
【问题讨论】:
-
dt[, groups := !is.na(column1) * cumsum(!is.na(column1))]可能会起作用,但是如果没有working example 就很难测试代码。 -
@lmo,不错的尝试。但这将为前 3 个连续的非 NA 值分配不同的组 ID。你错过了一对括号:
(!is.na(column1)) * cumsum(!is.na(column1)) -
@mt1022 谢谢。就像我说的,没有工作示例就很难测试代码。
标签: r boolean label data.table na