R 基于变量运行和其他变量的附加条件定义序列

R 基于变量运行和其他变量的附加条件定义序列,r,dplyr,tidyverse,R,Dplyr,Tidyverse,在上面的数据中,我需要定义一个列,该列将包含group列的运行长度类型id(如data.table::rleid生成,但忽略NA)。正如您所看到的,我们还有列seq_break,它应该结束一个序列。通常是这样的,比如当group=NA然后seq\u break=TRUE。但有时seq_break=TRUE且组为A或B——则应结束序列并启动新序列,即使下一行指的是同一组。因此,例如,对于行25:26,我们应该有两个不同的序列id,即使这两个事件都指向组B。通常,预期输出如下所示: structur

在上面的数据中,我需要定义一个列,该列将包含
group
列的运行长度类型id(如
data.table::rleid
生成,但忽略
NA
)。正如您所看到的,我们还有列
seq_break
,它应该结束一个序列。通常是这样的,比如当
group=NA
然后
seq\u break=TRUE
。但有时
seq_break=TRUE
且组为
A
B
——则应结束序列并启动新序列,即使下一行指的是同一组。因此,例如,对于行
25:26
,我们应该有两个不同的序列id,即使这两个事件都指向组
B
。通常,预期输出如下所示:

structure(list(group = c(NA, "A", "B", NA, "B", "B", "B", "B", 
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", 
"B", NA, NA, "B", "B", "A", "A", NA, NA, "B", "B", "B", NA, "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", NA, NA, "B", "B", 
NA, "A"), seq_break = c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, 
TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE)), .Names = c("group", 
"seq_break"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-50L))

如何使用
tidyverse
?使用
tidyverse
data.table
的解决方案。假设
dt1
是示例数据帧,
dt3
是最终输出。请注意,我认为在预期的输出中,第47到48行应该是9,第50行应该是10。我不知道为什么在您的预期输出中,第47到48行是11,第50行是12

structure(list(group = c(NA, "A", "B", NA, "B", "B", "B", "B", 
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", 
"B", NA, NA, "B", "B", "A", "A", NA, NA, "B", "B", "B", NA, "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", NA, NA, "B", "B", 
NA, "A"), seq_break = c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, 
TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE), expected_output = c(NA, 
1, 2, NA, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
3, NA, NA, 4, 5, 6, 6, NA, NA, 7, 7, 7, NA, 8, 8, 8, 8, 8, 8, 
8, 8, 8, 8, NA, NA, 11, 11, NA, 12)), .Names = c("group", "seq_break", 
"expected_output"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-50L))
库(tidyverse)
库(数据表)
dt2%rowid_到_列()
dt3%
突变(ID=rleid(组,序列中断))%>%
分组依据(分组,顺序中断,ID)%>%
过滤器(!(is.na(组)&序列中断和行编号()>1))%>%
解组()%>%
突变(ID2=cumsum(seq_break))%>%
下降(组别)%>%
突变(预期的_输出=rleid(组,ID2))%>%
选择(rowid,预期的_输出)%>%
左联合(dt2,by=“rowid”)%>%
选择(-rowid)
dt3
##tibble:50 x 3
#组顺序\u中断预期\u输出
#                    
#1不适用真不适用
#2 A错误1
#3 B错误2
#4不适用真不适用
#5 B错误3
#6 B错误3
#7 B错误3
#8 B错误3
#9 B错误3
#10 B错误3
# # ... 还有40行
library(tidyverse)
library(data.table)

dt2 <- dt1 %>% rowid_to_column() 

dt3 <- dt2 %>%
  mutate(ID = rleid(group, seq_break)) %>%
  group_by(group, seq_break, ID) %>%
  filter(!(is.na(group) & seq_break & row_number() > 1)) %>%
  ungroup() %>%
  mutate(ID2 = cumsum(seq_break)) %>%
  drop_na(group) %>%
  mutate(expected_output = rleid(group, ID2)) %>%
  select(rowid, expected_output) %>%
  left_join(dt2, ., by = "rowid") %>%
  select(-rowid)

dt3
# # A tibble: 50 x 3
#    group seq_break expected_output
#    <chr> <lgl>               <int>
#  1 NA    TRUE                   NA
#  2 A     FALSE                   1
#  3 B     FALSE                   2
#  4 NA    TRUE                   NA
#  5 B     FALSE                   3
#  6 B     FALSE                   3
#  7 B     FALSE                   3
#  8 B     FALSE                   3
#  9 B     FALSE                   3
# 10 B     FALSE                   3
# # ... with 40 more rows