【问题标题】:count sequences of numbers in a dataframe column using a for loop R使用for循环R计算数据框列中的数字序列
【发布时间】:2019-09-24 17:51:54
【问题描述】:

我想计算一个数字序列在 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 循环的想法(为了学习),但对其他方式持开放态度。谢谢。

【问题讨论】:

    标签: r dataframe for-loop counter


    【解决方案1】:

    这可以在没有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"))
    

    【讨论】:

    • 谢谢@akrun,我稍微编辑了这个问题--rle 有效,但是我的意思是让序列 1 和 2 一起运行..
    • 谢谢@akrun,这对您很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多