【问题标题】:mutate w for loop in R在R中改变w for循环
【发布时间】:2020-11-12 12:30:17
【问题描述】:

我有一个看起来像这样的数据...

df <- tibble (
  old_col = c(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE))

...我正在尝试编写一个 for 循环,该循环将添加一个递增计数的变量,每次有 TRUE 时都会更改,所以我最终得到一个像这样的 df...

df <- tibble (
  old_col = c(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE),
new_col = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3)

到目前为止,我已经尝试过这段代码...


for(i in 1:nrow(df)){
  if(i==1){
   df$new_col[i]= 1 # For first point
  }
  else if(df$old_col[i] == "FALSE") {
   df$new_col[i]=df$new_col[i-1] 
  }
  
  else {
   df$new_col[i]=2
  }
  
} 

但是 else 部分是错误的。我不知道该放什么让它计数为 3,然后下次有 TRUE 时计数为 4。

我是循环新手!感谢您的帮助!

PS 如果有针对此类问题的 tidyverse 解决方案,我很想听听。

【问题讨论】:

    标签: r for-loop dplyr


    【解决方案1】:

    您可以对每个TRUE 值自动递增的逻辑值求和。由于第一个值是FALSE,我们将+ 1 添加到cumsum 的输出中。

    df$new_col <- cumsum(df$old_col) + 1
    df
    
    # A tibble: 12 x 2
    #   old_col new_col
    #   <lgl>     <dbl>
    # 1 FALSE         1
    # 2 FALSE         1
    # 3 FALSE         1
    # 4 FALSE         1
    # 5 FALSE         1
    # 6 TRUE          2
    # 7 FALSE         2
    # 8 FALSE         2
    # 9 FALSE         2
    #10 TRUE          3
    #11 FALSE         3
    #12 FALSE         3
    

    使用tidyverse

    library(dplyr)
    df %>% mutate(new_col = cumsum(old_col) + 1)
    

    【讨论】:

    • 啊,当然,你可以总结一个合乎逻辑的——太棒了!谢谢!!
    【解决方案2】:

    cumsum() 是前往此处的标准方式。您可以只需稍作修改即可使用循环(我还添加了一些简化/清理):

    for (i in 1:nrow(df)) {
      if (i == 1) {
        # For first point
        df$new_col[i] = 1
      } else if (!df$old_col[i]) {
        df$new_col[i] = df$new_col[i-1] 
      } else {
        df$new_col[i] = df$new_col[i-1] + 1L
      }
    } 
    

    【讨论】:

      猜你喜欢
      • 2021-03-06
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多