【问题标题】:Add a new column that maps one character string onto a new character string based on a "Rosetta Stone" data frame?添加一个新列,将一个字符串映射到基于“Rosetta Stone”数据框的新字符串?
【发布时间】:2018-01-04 00:27:08
【问题描述】:

我在 R 中有一个数据框。

我正在尝试添加/更改一个新列,该列使用映射/翻译/Rosetta Stone 数据框将几个旧字符串映射到新字符串,该数据框定义了我想要替换的字符串。

我在想一些涉及dplyr::mutate 和某种适用于gsub 的函数,但我不能把它们放在一起。

起始数据框:

  starting_df <- read.table(header=TRUE, text="
  ID   Genotype
  VIT_123_1    0
  ROM_456_2    0
  VIT_78_1     1
  BELG_910_1   1
")

罗塞塔石碑数据框:

  map_df <- read.table(header=TRUE, text="
  ID   New_ID
  VIT   VCO1
  ROM   VRO1
  BELG  VBE2
")

所需的输出数据帧:

  >head(updated_df)
    ID           Genotype    New_ID
    VIT_123_1    0           VCO1_123_1
    ROM_456_2    0           VRO1_456_2
    VIT_78_1     1           VCO1_78_1
    BELG_910_1   1           VBE2_910_1

【问题讨论】:

    标签: r gsub dplyr


    【解决方案1】:

    您可以使用stringr 包中的str_replace_all

    首先将您的 map_df 数据框转换为命名向量:

    map_v = as.character(map_df$New_ID)
    names(map_v) = map_df$ID
    

    然后用新值替换旧值:

    library(stringr)
    res = starting_df
    res$New_ID = str_replace_all(starting_df$ID,map_v)
    
              ID Genotype     New_ID
    1  VIT_123_1        0 VCO1_123_1
    2  ROM_456_2        0 VRO1_456_2
    3   VIT_78_1        1  VCO1_78_1
    4 BELG_910_1        1 VBE2_910_1
    

    【讨论】:

    • 当我尝试这个时,我得到一个错误:“replacement 必须是一个字符向量”。当我尝试使用 map_v
    • 您可以在创建 map_df 数据框时添加 stringsAsFactors=F,以便您的向量是字符类型,或者您可以在创建 map_v 时添加 map_v = as.character(map_df$New_ID)
    【解决方案2】:

    你可以使用 match 函数来做到这一点,而无需使用 stringr

    updated_df <- starting_df # this is simply because your question specifies a new dataframe
    updated_df$New_ID <- map_df$New_ID[match(updated_df$ID, map_df$ID)]
    

    【讨论】:

      猜你喜欢
      • 2020-04-13
      • 1970-01-01
      • 2019-08-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 2017-02-24
      • 1970-01-01
      相关资源
      最近更新 更多