如何在满足条件后更改每一行中的变量

How to alter a variable in every row after a condition has been met

本质上,我需要更改满足特定条件后出现的每一行。虽然我还需要循环服从分组变量。我的数据的简化版本(如下所示)是分组变量 (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 中的解决方案是首选,但我还没有找到。

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

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.

您可以在 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