使用 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