如何在data.table列中标记/计算连续的非NA值对?

时间:2017-05-08 16:46:49

标签: r boolean label data.table na

我有以下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方法来做到这一点?

1 个答案:

答案 0 :(得分:3)

以下是rle的解决方案:

library(data.table)
set.seed(1)
dt <- data.table(column1 = sample(c(rep(NA, 3), '1'), 30, replace = T))

x <- rle(dt$column1)
y <- cumsum(!is.na(x$values))
y[duplicated(y)] <- 0
x$values <- y
set(dt, NULL, 'group', inverse.rle(x))

# > dt
#     column1 group
# 1:      NA     0
# 2:      NA     0
# 3:      NA     0
# 4:       1     1
# 5:      NA     0
# 6:       1     2
# 7:       1     2
# 8:      NA     0
# 9:      NA     0
# 10:      NA     0
# 11:      NA     0
# 12:      NA     0
# 13:      NA     0
# 14:      NA     0
# 15:       1     3
# 16:      NA     0
# 17:      NA     0
# 18:       1     4
# 19:      NA     0
# 20:       1     5
# 21:       1     5
# 22:      NA     0
# 23:      NA     0
# 24:      NA     0
# 25:      NA     0
# 26:      NA     0
# 27:      NA     0
# 28:      NA     0
# 29:       1     6
# 30:      NA     0
# column1 group

结合lmo的评论,可以简化为:

x <- rle(dt$column1)
x$values <- (!is.na(x$values)) * cumsum(!is.na(x$values))

set(dt, NULL, 'group', inverse.rle(x))