使用带粘贴的For循环将df中的值替换为另一个df中的值

时间:2020-07-03 02:32:09

标签: r loops dataframe replace paste

我有一个问题,即将一个数据框中的拼写错误替换为另一数据框中的标准化拼写。具体来说,我有一个巨大的文件,其中包含多列抗生素名称(拼写错误)及其相邻列中的相应结果(抗药性(-)或敏感物(+))。 我创建了一个新的df,其中包含每个抗生素名称的标准化版本,但是我不确定如何用标准化版本替换第一个数据框中多个列的许多拼写错误,同时又将其与原始结果相关联。 这是我的df包含3列拼写错误的抗生素及其实验室结果的示例

Antibiotics.1 <- tibble(Sample = c('1','2','3'),
              A1_Name = c('AMOXCILLIN','AMOXCILLIN','CHLORAMHENICOL'),
              A1_Result = c('+','-','-'),
              A2_Name = c('CHLORAMPHENICOL ','APRMYCIN ','APRMYCIN '),
              A2_Result = c('-','+','-'),
              A3_Name = c('FLORFENICO','FLORFENICO','AMOXCILLIN'),
              A3_Result = c('+','+','-'))

这是一个包含标准化抗生素名称的df示例(我想用之前的df替换拼写错误)

standardised_antibiotics.1 <- tibble(A_Name = c('AMOXCILLIN','CHLORAMHENICOL','APRMYCIN','FLORFENICO'),
              A_Name_Standardised = c('AMOXICILLIN','CHLORAMPHENICOL','APRAMYCIN','FLORFENICOL'))

我有太多的拼写错误,无法全部手动输入,因此理想情况下,我需要可以逐行使用的东西。我们将一个df中的拼写错误与标准化df中的相同拼写进行匹配,然后在相邻列中将其替换为标准化版本。 我考虑过使用'for'循环或带有'case_when'的'cross'函数来编写函数。我不确定最好的方法是什么。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

首先将正确的拼写添加到查找数据框中:

standardised_antibiotics.1 <- tibble(A_Name = c('AMOXCILLIN','CHLORAMHENICOL','APRMYCIN','FLORFENICO', 'AMOXICILLIN','CHLORAMPHENICOL','APRAMYCIN','FLORFENICOL'),
                                     A_Name_Standardised = c('AMOXICILLIN','CHLORAMPHENICOL','APRAMYCIN','FLORFENICOL', 'AMOXICILLIN','CHLORAMPHENICOL','APRAMYCIN','FLORFENICOL'))

然后,您可以通过match()使用范围界定的方法来dplyr

library(dplyr)

Antibiotics.1 %>%
  mutate(across(ends_with("Name"), ~ standardised_antibiotics.1$A_Name_Standardised[match(trimws(.x), standardised_antibiotics.1$A_Name)]))

# A tibble: 3 x 7
  Sample A1_Name         A1_Result A2_Name         A2_Result A3_Name     A3_Result
  <chr>  <chr>           <chr>     <chr>           <chr>     <chr>       <chr>    
1 1      AMOXICILLIN     +         CHLORAMPHENICOL -         FLORFENICOL +        
2 2      AMOXICILLIN     -         APRAMYCIN       +         FLORFENICOL +        
3 3      CHLORAMPHENICOL -         APRAMYCIN       -         AMOXICILLIN -     

或者不添加正确的名称,您可以使用stringr::str_replace_all()

library(stringr)

Antibiotics.1 %>%
  mutate(across(ends_with("Name"), ~ str_replace_all(trimws(.x), setNames(standardised_antibiotics.1$A_Name_Standardised, standardised_antibiotics.1$A_Name))))