在R中的条件下重新开始计数
我有一个包含连续流1和0的标志列。我想添加1的流。当遇到0时,求和应该停止。对于下一个1流,求和应该重新开始 我尝试过cumsum(Negrad_flag==1),它在0之后继续求和在R中的条件下重新开始计数,r,R,我有一个包含连续流1和0的标志列。我想添加1的流。当遇到0时,求和应该停止。对于下一个1流,求和应该重新开始 我尝试过cumsum(Negrad_flag==1),它在0之后继续求和 negread_flag result 1 1 1 2 1 3 1 4 0 0 0 0 0 0 1
negread_flag result
1 1
1 2
1 3
1 4
0 0
0 0
0 0
1 1
1 2
1 3
0 0
我们可以使用
rleid
(运行长度id-在相邻元素不同时生成不同的id)作为分组变量,然后获取组的序列并将其分配给'result',其中'negread_flag'为1,通过将其分配给NULL
library(data.table)
setDT(df1)[, grp := rleid(negread_flag)
][, result := 0
][negread_flag == 1,
result := seq_len(.N), grp][, grp := NULL][]
# negread_flag result
# 1: 1 1
# 2: 1 2
# 3: 1 3
# 4: 1 4
# 5: 0 0
# 6: 0 0
# 7: 0 0
# 8: 1 1
# 9: 1 2
#10: 1 3
#11: 0 0
或者类似于
tidyverse
,使用rleid
(来自data.table
),通过将row\u number()
与“negread\u标志”相乘来创建“result”,使“negread\u标志”中对应于0的值变为0
library(tidyverse)
df1 %>%
group_by(grp = rleid(negread_flag)) %>%
mutate(result = row_number() * negread_flag) %>%
ungroup %>%
select(-grp)
# A tibble: 11 x 2
# negread_flag result
# <int> <int>
# 1 1 1
# 2 1 2
# 3 1 3
# 4 1 4
# 5 0 0
# 6 0 0
# 7 0 0
# 8 1 1
# 9 1 2
#10 1 3
#11 0 0
或者像@markus评论的那样
df1$result[i1] <- sequence(rle(df1$negread_flag)$lengths) * df1$negread_flag
df1$result[i1]@Henrik复制链接没有给我预期的输出with(df1,(!negread_flag)*unlist(lapply(rle(negread_flag)$length,seq_len))。[1]0 0 0 0 0 1 2 3 0 0 1
df1$result[i1] <- sequence(rle(df1$negread_flag)$lengths) * df1$negread_flag
df1 <- structure(list(negread_flag = c(1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L,
1L, 1L, 0L)), row.names = c(NA, -11L), class = "data.frame")