Определите, появляются ли наблюдения в группе друг за другом - PullRequest
1 голос
/ 15 января 2020

У меня есть:

df<-data.frame(group=c(1, 1,1, 1,1, 2, 2, 2, 4,4,4,4, 5,5,5,5,5,5,5,5,5,5,5), 
               value=c("A","B","A","A","A","B","A","B","A","A","D","A","B","B","B","B","B","A","A","A","A","A","A"),
            want=c("yes","yes","yes","yes","yes", "no","no","no", "no","no","no", "no","yes","yes","yes", "yes","yes","yes", "yes" ,"yes","yes","yes","yes" ))

   group value want
1      1     A  yes
2      1     B  yes
3      1     A  yes
4      1     A  yes
5      1     A  yes
6      2     B   no
7      2     A   no
8      2     B   no
9      4     A   no
10     4     A   no
11     4     D   no
12     4     A   no
13     5     B  yes
14     5     B  yes
15     5     B  yes
16     5     B  yes
17     5     B  yes
18     5     A  yes
19     5     A  yes
20     5     A  yes
21     5     A  yes
22     5     A  yes
23     5     A  yes

Я хочу выяснить в моем 'хотении', появляется ли значение "А" хотя бы три раза подряд где-то в группе.

Ответы [ 3 ]

3 голосов
/ 15 января 2020
library(dplyr)
df %>%
    group_by(group) %>%
    mutate(temp = with(rle(as.character(value)), any(values == "A" & lengths >= 3)))
1 голос
/ 15 января 2020

Опция, использующая data.table:

g <- setDT(df)[, r := rowid(rleid(group, value))][, 
    max(r), group][
        V1>=3L, group]
df[, w := fifelse(group %in% g, "yes", "no")]

, вывод:

    group value want r   w
 1:     1     A  yes 1 yes
 2:     1     B  yes 1 yes
 3:     1     A  yes 1 yes
 4:     1     A  yes 2 yes
 5:     1     A  yes 3 yes
 6:     2     B   no 1  no
 7:     2     A   no 1  no
 8:     2     B   no 1  no
 9:     4     A   no 1  no
10:     4     A   no 2  no
11:     4     D   no 1  no
12:     4     A   no 1  no
13:     5     B  yes 1 yes
14:     5     B  yes 2 yes
15:     5     B  yes 3 yes
16:     5     B  yes 4 yes
17:     5     B  yes 5 yes
18:     5     A  yes 1 yes
19:     5     A  yes 2 yes
20:     5     A  yes 3 yes
21:     5     A  yes 4 yes
22:     5     A  yes 5 yes
23:     5     A  yes 6 yes
    group value want r   w
0 голосов
/ 15 января 2020

Интуитивно понятное решение:

groups = unique(df$group)
df$want = 'no'

for(group in groups)
{
  newDf = df[df$group == group,]
  if(nrow(newDf) > 2)
  {
    for(i in 1:(nrow(newDf)-2))
    {
      if(newDf$value[i] == 'A' & newDf$value[i+1] == 'A' & newDf$value[i+2] == 'A')
      {
        df$want[df$group == group] = 'yes'
        break
      }
    }
  }
}

Условие if(nrow(newDf) > 2) состоит в том, что если в группе меньше 3 итогов, вам не нужно ничего проверять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...