如何从 R 中的特定字符串按组创建序列?
How to create a sequency by group from a specific string in R?
我想在一个组中创建一个数字序列,但从一个特定的字符串开始。
在此示例中,如果字符串匹配 UNP,则序列(seq
列)应从下一行开始。
ColA
Colb
Seq
A
HM
0
A
RES
0
A
UNP
0
A
RES
1
A
RES
2
A
HM
3
B
HM
0
B
RES
0
B
UNP
0
B
RES
1
B
UNP
2
C
UNP
0
仅应考虑 UNP 的第一个实例,而不是每个组的 UNP 上的每个实例
您可以先创建一个指定第一次出现“UNP”的列,然后使用 cumsum()
和 lag()
计算 Seq
列。
library(dplyr)
df <- read.table(header = T, text = "
ColA Colb Seq
A HM 0
A RES 0
A UNP 0
A RES 1
A RES 2
A HM 3
B HM 0
B RES 0
B UNP 0
B RES 1
B UNP 2
C UNP 0") %>%
select(-Seq)
df %>%
group_by(ColA, Colb) %>%
mutate(seq_count = ifelse(first(Colb) == "UNP" & !duplicated(Colb), 1, 0)) %>%
group_by(ColA) %>%
mutate(Seq = lag(cumsum(cumsum(seq_count)), default = 0), .keep = "unused")
#> # A tibble: 12 × 3
#> # Groups: ColA [3]
#> ColA Colb Seq
#> <chr> <chr> <dbl>
#> 1 A HM 0
#> 2 A RES 0
#> 3 A UNP 0
#> 4 A RES 1
#> 5 A RES 2
#> 6 A HM 3
#> 7 B HM 0
#> 8 B RES 0
#> 9 B UNP 0
#> 10 B RES 1
#> 11 B UNP 2
#> 12 C UNP 0
由 reprex package (v2.0.1)
创建于 2022-03-31
我想在一个组中创建一个数字序列,但从一个特定的字符串开始。
在此示例中,如果字符串匹配 UNP,则序列(seq
列)应从下一行开始。
ColA | Colb | Seq |
---|---|---|
A | HM | 0 |
A | RES | 0 |
A | UNP | 0 |
A | RES | 1 |
A | RES | 2 |
A | HM | 3 |
B | HM | 0 |
B | RES | 0 |
B | UNP | 0 |
B | RES | 1 |
B | UNP | 2 |
C | UNP | 0 |
仅应考虑 UNP 的第一个实例,而不是每个组的 UNP 上的每个实例
您可以先创建一个指定第一次出现“UNP”的列,然后使用 cumsum()
和 lag()
计算 Seq
列。
library(dplyr)
df <- read.table(header = T, text = "
ColA Colb Seq
A HM 0
A RES 0
A UNP 0
A RES 1
A RES 2
A HM 3
B HM 0
B RES 0
B UNP 0
B RES 1
B UNP 2
C UNP 0") %>%
select(-Seq)
df %>%
group_by(ColA, Colb) %>%
mutate(seq_count = ifelse(first(Colb) == "UNP" & !duplicated(Colb), 1, 0)) %>%
group_by(ColA) %>%
mutate(Seq = lag(cumsum(cumsum(seq_count)), default = 0), .keep = "unused")
#> # A tibble: 12 × 3
#> # Groups: ColA [3]
#> ColA Colb Seq
#> <chr> <chr> <dbl>
#> 1 A HM 0
#> 2 A RES 0
#> 3 A UNP 0
#> 4 A RES 1
#> 5 A RES 2
#> 6 A HM 3
#> 7 B HM 0
#> 8 B RES 0
#> 9 B UNP 0
#> 10 B RES 1
#> 11 B UNP 2
#> 12 C UNP 0
由 reprex package (v2.0.1)
创建于 2022-03-31