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 如果它使它更容易或更有效 NA
s 可以变成 0
或 1
它没有区别,我我猜这样效率更高。
尝试
dat[, before:=1-cumsum(non_pol=="*"), by=.(id, id2, pol_loc)][non_pol=="*", before:=NA,]
请随意编辑此标题,使其更加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 如果它使它更容易或更有效 NA
s 可以变成 0
或 1
它没有区别,我我猜这样效率更高。
尝试
dat[, before:=1-cumsum(non_pol=="*"), by=.(id, id2, pol_loc)][non_pol=="*", before:=NA,]