当值重复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
或者使用rleid
的data.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次或更多次时创建新列的主要内容,如果未能解决你的问题,请参考以下文章