считать последовательности чисел в столбце данных, используя цикл for R - PullRequest
1 голос
/ 24 сентября 2019

Я хочу посчитать, сколько раз последовательность чисел встречается в R, в этом случае, скажем, 1, а затем 2 (1 и 2 в последовательности), пытаясь использовать цикл for.

set.seed(123)
df<-as.data.frame(replicate(1,sample(0:2,50,rep=TRUE)))
> df
   V1
1   2
2   2
3   2
4   1
5   2
6   1
7   1
8   1

...

counter = 0
for(i in seq_along(var1$df)){
  if(i == 1 & i + 1 == 2){
        counter = counter + 1
  }
}

counter

По сути, я пытаюсь подсчитать, сколько раз последовательность встречается в столбце.Мне нравится идея цикла for (для обучения ради), но я открыт для других способов.Спасибо.

1 Ответ

1 голос
/ 24 сентября 2019

Это может быть достигнуто без for петли

f1 <-function(vec, val){
        rl <- rle(vec)
        sum(rl$values[-length(rl$values)] == val[1] & rl$values[-1] == val[2])
   }

f1(df$V1, 1:2)
#[1] 1

или с использованием rleid

library(dplyr)
library(data.table)
df %>% 
    group_by(grp = rleid(V1), V1) %>% 
    slice(1) %>% 
    ungroup %>% 
    mutate(V2 = lead(V1, default = last(V1))) %>%
    summarise(n = sum(V1 == 1 & V2 == 2))

Или другой вариант - pasteэлементы вместе и получить счет с str_count

library(stringr)
str_count(str_c(df$V1, collapse=""), "12")
#[1] 1

Кроме того, используя for цикл

counter  <- 0
    for(i in seq_len(nrow(df)-1)) {
      if(df$V1[i] == 1 & df$V1[i+1] == 2) {
         counter <- counter + 1
        }

    }
counter
#[1] 1

данные

df <- structure(list(V1 = c(2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L)), 
  class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8"))
...