使用data.table::rleid创建序列,并根据附加条件排除某些行
我想创建一系列后续的相同值,如使用data.table::rleid创建序列,并根据附加条件排除某些行,r,dplyr,data.table,R,Dplyr,Data.table,我想创建一系列后续的相同值,如data.table::rleiddoes。但问题是,我希望从序列中排除一些行,而应该排除哪些行可以由另一列定义。我已经发现,data.table::rleid可以使用两次,但仍然不能产生理想的结果-请参见以下内容: my_example <- structure(list(event = c(234, 234, 224, 232, 232, 201, 201, 201, 201, 201, 201, 201, 244, 244, 201, 201, 201
data.table::rleid
does。但问题是,我希望从序列中排除一些行,而应该排除哪些行可以由另一列定义。我已经发现,data.table::rleid
可以使用两次,但仍然不能产生理想的结果-请参见以下内容:
my_example <- structure(list(event = c(234, 234, 224, 232, 232, 201, 201, 201,
201, 201, 201, 201, 244, 244, 201, 201, 201, 244, 244, 212, 201,
201, 201, 249, 201, 201, 201, 201, 201, 201, 201, 249, 201, 201,
244, 244, 201, 261, 245, 203, 204, 204, 201, 201, 201, 201, 201,
201, 216, 201), subgroup = c(10L, 11L, 10L, 10L, 11L, 10L, 10L,
10L, 10L, 10L, 10L, 11L, 11L, 10L, 10L, 10L, 10L, 10L, 11L, 11L,
10L, 11L, 11L, 11L, 11L, 11L, 11L, 10L, 11L, 11L, 11L, 10L, 10L,
10L, 10L, 11L, 11L, 10L, 11L, 10L, 10L, 11L, 10L, 10L, 10L, 10L,
10L, 10L, 10L, 11L)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -50L), .Names = c("event", "subgroup"))
my_example %>%
mutate(in_seq = ! event %in% c(224, 232, 234, 261),
seq = data.table::rleid(subgroup) * in_seq,
seq2 = data.table::rleid(seq))
# A tibble: 50 x 5
event subgroup in_seq seq seq2
<dbl> <int> <lgl> <int> <int>
1 234 10 F 0 1
2 234 11 F 0 1
3 224 10 F 0 1
4 232 10 F 0 1
5 232 11 F 0 1
6 201 10 T 5 2
7 201 10 T 5 2
8 201 10 T 5 2
9 201 10 T 5 2
10 201 10 T 5 2
# ... with 40 more rows
my_示例%
突变(在%c(224232 234 261)中的事件%),
seq=数据表::rleid(子组)*在,
seq2=数据表::rleid(seq))
#一个tibble:50x5
_seq 2中的事件子组
1234 10楼01
223411f1
3224 10 F 0 1
4 232 10 F 0 1
5 232 11 F 0 1
620101052
720101052
820101052
9 201 10 T 5 2
1020110T52
# ... 还有40行
如何从计算中排除某些行?(在上面的示例中,这意味着第1:5行和第38行在
seq2
中都有NA)如果我们想将“s2”中的值更改为NA
library(data.table)
my_example %>%
mutate(in_seq = ! event %in% c(224, 232, 234, 261),
s1 = rleid(subgroup * in_seq),
s2 = rleid(s1) * NA ^ !in_seq)
或者如果“s2”需要从“1”开始,则跳过“in seq”中的FALSE
my_example %>%
mutate(in_seq = ! event %in% c(224, 232, 234, 261),
s1 = data.table::rleid(subgroup) * in_seq,
s2 = (NA^!s1) * s1,
s2 = match(s2, unique(na.omit(s2))))
也可能是
setDT(my_example)[, in_seq := !event %in% c(224, 232, 234, 261)
][, s1 := rleid(subgroup) * in_seq
][s1 != 0, s2 := rleid(s1)]
你能显示出预期的输出吗?根据这个示例,“seq”从1开始不完全是这样,我仍然希望将这些行保留在data.frame中,只是从序列号中排除