根据 R 中的匹配条件在新列中创建唯一行值
Create unique row values in new column based on matching criteria in R
我有一个数据框,其中包含一个唯一值标识符列和一个包含特定条件的列。
我想创建一个新的唯一值标识符列,但该值还包含有关它满足哪些条件的信息。在下面的示例中,我使用 case_when()
和 seq_along()
来完成此操作:
set.seed(1)
df <- data.frame(
ID = LETTERS[1:10],
Criteria = paste0("Crit ", floor(runif(10, min=1, max=4)))
)
df %>%
mutate(
ID2 = case_when(
Criteria == "Crit 1" ~ paste0("x", seq_along(Criteria)),
Criteria == "Crit 2" ~ paste0("y", seq_along(Criteria)),
Criteria == "Crit 3" ~ paste0("z", seq_along(Criteria))
)
)
输出:
A data.frame: 10 × 3
ID Criteria ID2
A c1 x1
B c2 y2
C c2 y3
D c3 z4
E c1 x5
F c3 z6
G c3 z7
H c2 y8
I c2 y9
J c1 x10
新列 ID2
现在具有唯一的行值(数字 1 到 10)并且可以在其中标识条件(字母 x、y 和 z)。但是,seq_along()
为每一行插入一个新数字,而不考虑标准。我宁愿每个标准的计数从 1 重新开始。 (例如,对于标准 c1
:x1
、x2
、x3
、...、xn
;对于 c2
:y1
, y2
, y3
, ..., ym
; 等等)
我想要的:
A data.frame: 10 × 3
ID Criteria ID2
A c1 x1
B c2 y1
C c2 y2
D c3 z1
E c1 x2
F c3 z2
G c3 z3
H c2 y3
I c2 y4
J c1 x3
您只需添加 group_by(Criteria)
:
library(dplyr)
df %>%
group_by(Criteria) %>%
mutate(
ID2 = case_when(
Criteria == "Crit 1" ~ paste0("x", seq_along(Criteria)),
Criteria == "Crit 2" ~ paste0("y", seq_along(Criteria)),
Criteria == "Crit 3" ~ paste0("z", seq_along(Criteria))
)
)
输出:
# A tibble: 10 × 3
# Groups: Criteria [3]
ID Criteria ID2
<chr> <chr> <chr>
1 A Crit 1 x1
2 B Crit 2 y1
3 C Crit 2 y2
4 D Crit 3 z1
5 E Crit 1 x2
6 F Crit 3 z2
7 G Crit 3 z3
8 H Crit 2 y3
9 I Crit 2 y4
10 J Crit 1 x3
我有一个数据框,其中包含一个唯一值标识符列和一个包含特定条件的列。
我想创建一个新的唯一值标识符列,但该值还包含有关它满足哪些条件的信息。在下面的示例中,我使用 case_when()
和 seq_along()
来完成此操作:
set.seed(1)
df <- data.frame(
ID = LETTERS[1:10],
Criteria = paste0("Crit ", floor(runif(10, min=1, max=4)))
)
df %>%
mutate(
ID2 = case_when(
Criteria == "Crit 1" ~ paste0("x", seq_along(Criteria)),
Criteria == "Crit 2" ~ paste0("y", seq_along(Criteria)),
Criteria == "Crit 3" ~ paste0("z", seq_along(Criteria))
)
)
输出:
A data.frame: 10 × 3
ID Criteria ID2
A c1 x1
B c2 y2
C c2 y3
D c3 z4
E c1 x5
F c3 z6
G c3 z7
H c2 y8
I c2 y9
J c1 x10
新列 ID2
现在具有唯一的行值(数字 1 到 10)并且可以在其中标识条件(字母 x、y 和 z)。但是,seq_along()
为每一行插入一个新数字,而不考虑标准。我宁愿每个标准的计数从 1 重新开始。 (例如,对于标准 c1
:x1
、x2
、x3
、...、xn
;对于 c2
:y1
, y2
, y3
, ..., ym
; 等等)
我想要的:
A data.frame: 10 × 3
ID Criteria ID2
A c1 x1
B c2 y1
C c2 y2
D c3 z1
E c1 x2
F c3 z2
G c3 z3
H c2 y3
I c2 y4
J c1 x3
您只需添加 group_by(Criteria)
:
library(dplyr)
df %>%
group_by(Criteria) %>%
mutate(
ID2 = case_when(
Criteria == "Crit 1" ~ paste0("x", seq_along(Criteria)),
Criteria == "Crit 2" ~ paste0("y", seq_along(Criteria)),
Criteria == "Crit 3" ~ paste0("z", seq_along(Criteria))
)
)
输出:
# A tibble: 10 × 3
# Groups: Criteria [3]
ID Criteria ID2
<chr> <chr> <chr>
1 A Crit 1 x1
2 B Crit 2 y1
3 C Crit 2 y2
4 D Crit 3 z1
5 E Crit 1 x2
6 F Crit 3 z2
7 G Crit 3 z3
8 H Crit 2 y3
9 I Crit 2 y4
10 J Crit 1 x3