Создать новый столбец, когда значения повторяются 3 или более раз - PullRequest
3 голосов
/ 24 апреля 2019

Проблема

Я пытаюсь создать новый столбец (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

1 Ответ

3 голосов
/ 24 апреля 2019

Мы можем использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...