我有一个标志列,其中包含连续的流1和0。我想添加1s的流。当遇到0时,求和应停止。对于下一个1s,应重新开始求和
我尝试过cumsum(negread_flag == 1),该值在0s之后继续求和
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
答案 0 :(得分:1)
我们可以使用NULL
(run-length-id-当相邻元素不同时生成不同的id)作为分组变量,然后获取组的序列并将其分配给“结果”,其中'negread_flag'为1,通过将'grp'列分配给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_number()
的{{1}},通过将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
与“ negread_flag”相乘来创建“结果”,以便“ negread_flag”中与0对应的值变为0
base R
或使用i1 <- df1$negread_flag != 0
df1$result[i1] <- with(rle(df1$negread_flag), sequence(lengths * values))
df1$result[i1] <- sequence(rle(df1$negread_flag)$lengths) * df1$negread_flag
或@markus评论
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")
{{1}}