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