data.table: 标记 before/after 符号在组内出现

data.table: Mark before/after occurrence of symbol within groups

请随意编辑此标题,使其更加understandable/generalizable...

我有一个 data.table object 有 3 列组成组 (id, id2 pol_loc).在这些组中是行观察,每组的某行会有一个星号或 NA。我想有效地为每组相对于星号的行创建一个指示器列(在 - 1 之前,在 - 0 之后)。这是数据 table 的样子:

    id id2 pol_loc non_pol cluster_tag
 1:  1   1       3      do          NA
 2:  1   1       3     you          NA
 3:  1   1       3       *          NA
 4:  1   1       3      it          NA
 -------------------------------------
 5:  1   2       3     but           4
 6:  1   2       3       i          NA
 7:  1   2       3       *          NA
 8:  1   2       3  really           2
 9:  1   2       3     bad          NA
 -------------------------------------
10:  1   2       5     but           4
11:  1   2       5       i          NA
12:  1   2       5    hate          NA
13:  1   2       5  really           2
14:  1   2       5       *          NA
15:  1   2       5    dogs          NA
 -------------------------------------
16:  2   1       4       i          NA
17:  2   1       4      am          NA
18:  2   1       4     the          NA
19:  2   1       4       *          NA
20:  2   1       4  friend          NA
 -------------------------------------
21:  3   1       4      do          NA
22:  3   1       4     you          NA
23:  3   1       4  really           2
24:  3   1       4       *          NA
 -------------------------------------
25:  3   2      NA      NA          NA
    id id2 pol_loc non_pol cluster_tag

期望输出:

这是所需的输出:

    id id2 pol_loc non_pol cluster_tag   before
 1:  1   1       3      do          NA        1
 2:  1   1       3     you          NA        1
 3:  1   1       3       *          NA       NA
 4:  1   1       3      it          NA        0
 ----------------------------------------------
 5:  1   2       3     but           4        1
 6:  1   2       3       i          NA        1
 7:  1   2       3       *          NA       NA
 8:  1   2       3  really           2        0
 9:  1   2       3     bad          NA        0
 ----------------------------------------------
10:  1   2       5     but           4        1
11:  1   2       5       i          NA        1
12:  1   2       5    hate          NA        1
13:  1   2       5  really           2        1
14:  1   2       5       *          NA       NA
15:  1   2       5    dogs          NA        0
 ----------------------------------------------
16:  2   1       4       i          NA        1
17:  2   1       4      am          NA        1
18:  2   1       4     the          NA        1
19:  2   1       4       *          NA       NA
20:  2   1       4  friend          NA        0
 ----------------------------------------------
21:  3   1       4      do          NA        1
22:  3   1       4     you          NA        1
23:  3   1       4  really           2        1
24:  3   1       4       *          NA       NA
 ----------------------------------------------
25:  3   2      NA      NA          NA       NA
    id id2 pol_loc non_pol cluster_tag   before

MWE

dat <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), 
    id2 = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L), pol_loc = c(3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, NA), non_pol = c("do", "you", 
    "*", "it", "but", "i", "*", "really", "bad", "but", "i", 
    "hate", "really", "*", "dogs", "i", "am", "the", "*", "friend", 
    "do", "you", "really", "*", NA), cluster_tag = c(NA, NA, 
    NA, NA, "4", NA, NA, "2", NA, "4", NA, NA, "2", NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, "2", NA, NA)), row.names = c(NA, 
-25L), class = "data.frame", .Names = c("id", "id2", "pol_loc", 
"non_pol", "cluster_tag"))

library(data.table)

setDT(dat)

EDIT 如果它使它更容易或更有效 NAs 可以变成 01 它没有区别,我我猜这样效率更高。

尝试

dat[, before:=1-cumsum(non_pol=="*"), by=.(id, id2, pol_loc)][non_pol=="*", before:=NA,]