当值重复3次或更多次时创建新列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当值重复3次或更多次时创建新列相关的知识,希望对你有一定的参考价值。

问题

我正在尝试根据前一列(b)中的值创建一个新列(a)。列a是二进制的,由0或1组成。如果a列中连续有三个或更多1,则将它们保存在b列中。我接近所需的输出,但是当连续两个1时,ifelse抓住第二个值,因为它符合第一个条件。

期望的输出列b

df <- data.frame(a = c(1,1,1,0,0,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,1),
                 b = c(1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1))
df
   a b
1  1 1
2  1 1
3  1 1
4  0 0
5  0 0
6  1 0
7  0 0
8  1 0 #
9  1 0 # 
10 0 0
11 1 1
12 1 1
13 1 1
14 0 0
15 1 0 #
16 1 0 #
17 0 0
18 1 1
19 1 1
20 1 1
21 1 1

失败尝试... s

require(dplyr)
df_fail <- df %>% mutate(b=ifelse((lag(df$a) + df$a) > 1 |(df$a + lead(df$a) + lead(df$a,2)) >= 3, df$a,NA))

df_fail
   a b
1  1 1
2  1 1
3  1 1
4  0 0
5  0 0
6  1 0
7  0 0
8  1 0
9  1 1 # should be 0
10 0 0
11 1 1
12 1 1
13 1 1
14 0 0
15 1 0
16 1 1 # should be 0
17 0 0
18 1 1
19 1 1
20 1 1
21 1 1
答案

我们可以使用rle中的base R将少于3个重复1的元素更改为0

inverse.rle(within.list(rle(df$a), values[values == 1 & lengths <3] <- 0))
#[1] 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1

或者使用rleiddata.table

library(data.table)
library(dplyr)
df %>% 
   group_by(grp = rleid(a)) %>%
   mutate(b1 = if(n() <3 & all(a == 1)) 0 else a) %>%
   ungroup %>%
   select(-grp)

以上是关于当值重复3次或更多次时创建新列的主要内容,如果未能解决你的问题,请参考以下文章

01正则表达式相关

常见正则表达式

正则表达式

正则表达式

正则表达式

常见正则表达式及身份证校验规则