使用 R 基于字典创建新列

Create a new column based on a dictionary using R

对于以下数据框 d,我正在尝试通过使用字典 dict_to_replace:

替换 col1 来创建一个新列
library(tidyverse)
library(stringr)

d <- data.frame(col1 = c("AA", "AG", "AC", "AA"), col2 = c(NA, "GG", "GG", "GC"), stringsAsFactors=FALSE)
dict_to_replace <- c('AA'='a', 'AG'='b')

d %>% 
  mutate(
    col3 = str_replace_all(col1, pattern = dict_to_replace)
  )

输出:

  col1 col2 col3
1   AA <NA>    a
2   AG   GG    b
3   AC   GG   AC
4   AA   GC    a

但我预计如果 col1 中的值不在 dict_to_replace 的键中,则替换为 NA 而不是 col1 中的值,这意味着预期结果将是这样的:

  col1 col2 col3
1   AA <NA>    a
2   AG   GG    b
3   AC   GG  <NA>
4   AA   GC    a

我如何使用 R 在管道 (%>%) 中实现这一点?谢谢。

我认为您不能使用 str_replace_all 来完成这项任务。另一种替代方法是使用 dplyr 包中的 recode

d %>% 
  mutate(
    col3 = recode(col1, !!!dict_to_replace, .default = NA_character_)
  )

在这里你使用 bang bang 运算符!!!取消引用 dict_to_replace 命名向量,.default 参数允许您更改 col1 列中不匹配的值。可以在文档中找到更多内容,如下所述:

.default If supplied, all values not otherwise matched will be given this value. If not supplied and if the replacements are the same type as the original values in .x, unmatched values are not changed. If not supplied and if the replacements are not compatible, unmatched values are replaced with NA.