【问题标题】:How to alter a variable in every row after a condition has been met满足条件后如何更改每一行中的变量
【发布时间】:2021-11-24 12:14:42
【问题描述】:

基本上,我需要更改满足特定条件后出现的每一行。虽然我也需要循环来服从分组变量。我的数据的简化版本(如下所示)是分组变量(Groups),后跟一个值(N),然后是条件变量(R)。您可以按如下方式创建我的数据的简化版本:

Groups <- c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C")
N <- c(1,1,1,1,1,1,1,1,1,1)
R <- c("N", "N", "Y", "N", "N", "N", "Y", "N", "N", "N")
Dat <- as.data.frame(cbind(Groups, N, R))

我需要的是,当 R == "Y" 时,该行以及该组之后的每一行都将 +1 添加到 N 变量中。所以解决方案应该是这样的:

   Groups N R
1       A 1 N
2       A 1 N
3       A 2 Y
4       A 2 N
5       B 1 N
6       B 1 N
7       B 2 Y
8       B 2 N
9       C 1 N
10      C 1 N

所以循环需要随着每个新组重新开始。理想情况下,首选 dplyr 中的解决方案,但我还没有找到。

任何帮助或指导将不胜感激!

【问题讨论】:

    标签: r for-loop dplyr tidyr


    【解决方案1】:

    您可以在match 的帮助下完成此操作。

    library(dplyr)
    
    Dat %>%
      group_by(Groups) %>%
      mutate(N = N + as.integer(row_number() >= match('Y', R, nomatch = n() + 1))) %>%
      ungroup
    
    #  Groups      N R    
    #   <chr>   <dbl> <chr>
    # 1 A          1 N    
    # 2 A          1 N    
    # 3 A          2 Y    
    # 4 A          2 N    
    # 5 B          1 N    
    # 6 B          1 N    
    # 7 B          2 Y    
    # 8 B          2 N    
    # 9 C          1 N    
    #10 C          1 N    
    

    【讨论】:

      【解决方案2】:

      cumsum 对逻辑向量进行分组并添加到“N”

      library(dplyr)
      Dat %>% 
         group_by(Groups) %>% 
         mutate(N = cumsum(R == "Y") + N) %>%
         ungroup()
      

      -输出

      # A tibble: 10 × 3
         Groups     N R    
         <chr>  <dbl> <chr>
       1 A          1 N    
       2 A          1 N    
       3 A          2 Y    
       4 A          2 N    
       5 B          1 N    
       6 B          1 N    
       7 B          2 Y    
       8 B          2 N    
       9 C          1 N    
      10 C          1 N    
      

      数据

      Dat <- data.frame(Groups, N, R)
      # NOTE: Using `cbind` converts to `matrix` and matrix can have only a single class.  Directly use `data.frame` instead of roundabout way which is not a correct approach.
      

      【讨论】:

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