使用 mutate 添加具有基于另一列的值的列?
Add columns with values based on another column using mutate?
我想在我的元数据 table 中添加一列 (type
),根据 id
列中的信息列出样本的类型。
id owner
<chr> <chr>
1 R1234 personA
2 R5678 personA
3 PAT12 personB
4 PAT34 personB
5 MOCK1 personB
6 MOCK2 personB
我使用下面的代码添加了 owner
列,这很简单,因为只有两个选项(personA 或 personB)。
tibble %>%
mutate(owner = if_else(str_detect(tibble$id,"^R.*"),"personA","personB"))
我正在努力处理最后一列,因为我需要三个不同的选项(反应器、患者或模拟),如下所示:
# A tibble: 6 × 3
id owner type
<chr> <chr> <chr>
1 R1234 personA reactor
2 R5678 personA reactor
3 PAT12 personB patient
4 PAT34 personB patient
5 MOCK1 personB mock
6 MOCK2 personB mock
我确定答案并不复杂,我只是在努力思考它。任何帮助表示赞赏!
您可以使用 case_when
(就像评论中指出的那样)。我使用 substr
作为条件,但您可以使用您选择的任何字符串过滤器。
library(dplyr)
df %>%
mutate(type = case_when(
substr(id,1,1)=="R" ~ "reactor",
substr(id,1,1)=="P" ~ "patient",
substr(id,1,1)=="M" ~ "mock"))
id owner type
1 R1234 personA reactor
2 R5678 personA reactor
3 PAT12 personB patient
4 PAT34 personB patient
5 MOCK1 personB mock
6 MOCK2 personB mock
创建命名查找字符向量,然后匹配第一个字母:
lookup <- setNames(c("reactor", "patient", "mock"), c("R", "P", "M"))
df$type <- lookup[ substr(df$id, 1, 1) ]
df
# id owner type
# 1 R1234 personA reactor
# 2 R5678 personA reactor
# 3 PAT12 personB patient
# 4 PAT34 personB patient
# 5 MOCK1 personB mock
# 6 MOCK2 personB mock
dat %>% mutate(type=case_when(
grepl("^R",id)~"reactor",
grepl("^P",id)~"patient",
grepl("^M",id)~"mock")
)
输出:
id owner type
<chr> <chr> <chr>
1 R1234 personA reactor
2 R5678 personA reactor
3 PAT12 personB patient
4 PAT34 personB patient
5 MOCK1 personB mock
6 MOCK2 personB mock
我想在我的元数据 table 中添加一列 (type
),根据 id
列中的信息列出样本的类型。
id owner
<chr> <chr>
1 R1234 personA
2 R5678 personA
3 PAT12 personB
4 PAT34 personB
5 MOCK1 personB
6 MOCK2 personB
我使用下面的代码添加了 owner
列,这很简单,因为只有两个选项(personA 或 personB)。
tibble %>%
mutate(owner = if_else(str_detect(tibble$id,"^R.*"),"personA","personB"))
我正在努力处理最后一列,因为我需要三个不同的选项(反应器、患者或模拟),如下所示:
# A tibble: 6 × 3
id owner type
<chr> <chr> <chr>
1 R1234 personA reactor
2 R5678 personA reactor
3 PAT12 personB patient
4 PAT34 personB patient
5 MOCK1 personB mock
6 MOCK2 personB mock
我确定答案并不复杂,我只是在努力思考它。任何帮助表示赞赏!
您可以使用 case_when
(就像评论中指出的那样)。我使用 substr
作为条件,但您可以使用您选择的任何字符串过滤器。
library(dplyr)
df %>%
mutate(type = case_when(
substr(id,1,1)=="R" ~ "reactor",
substr(id,1,1)=="P" ~ "patient",
substr(id,1,1)=="M" ~ "mock"))
id owner type
1 R1234 personA reactor
2 R5678 personA reactor
3 PAT12 personB patient
4 PAT34 personB patient
5 MOCK1 personB mock
6 MOCK2 personB mock
创建命名查找字符向量,然后匹配第一个字母:
lookup <- setNames(c("reactor", "patient", "mock"), c("R", "P", "M"))
df$type <- lookup[ substr(df$id, 1, 1) ]
df
# id owner type
# 1 R1234 personA reactor
# 2 R5678 personA reactor
# 3 PAT12 personB patient
# 4 PAT34 personB patient
# 5 MOCK1 personB mock
# 6 MOCK2 personB mock
dat %>% mutate(type=case_when(
grepl("^R",id)~"reactor",
grepl("^P",id)~"patient",
grepl("^M",id)~"mock")
)
输出:
id owner type
<chr> <chr> <chr>
1 R1234 personA reactor
2 R5678 personA reactor
3 PAT12 personB patient
4 PAT34 personB patient
5 MOCK1 personB mock
6 MOCK2 personB mock