通过匹配存储在另一个 DataFrame 中的字符串来替换 DataFrame 中的特定值

Substitute specific values in a dataframe by matching strings stored in another dataframe

提问人:DaniCee 提问时间:2/6/2023 最后编辑:zx8754DaniCee 更新时间:2/6/2023 访问量:83

问:

假设我有一个如下所示的数据框:

mydf=data.frame(id=LETTERS, value=runif(26,0,1), match1=sample(c(0,1),26,replace=T), match2=sample(c(0,2),26,replace=T), match3=sample(c(0,3),26,replace=T), all_matches=sample(0:3,26,replace=T))

如下所示:

> mydf
   id       value match1 match2 match3 all_matches
1   A 0.267675256      1      0      0           0
2   B 0.974518682      1      0      3           3
3   C 0.175529131      1      2      3           0
4   D 0.050552174      0      2      0           0
5   E 0.228286981      0      0      0           1
6   F 0.025520208      0      2      3           1
7   G 0.206697937      1      2      0           2
8   H 0.644523511      0      2      3           2
9   I 0.342110147      0      0      3           3
10  J 0.430250450      1      0      0           1
...

match1列有 0 和 1 值,有 0 和 2 值,0 和 3,值从 0 到 3。match2match3all_matches

我在这里唯一想做的是将这些列中的 1、2 和 3 值重写为与这些值关联的值,并存储在另一个数据框中:name

match_df=data.frame(match=1:3, name=c('ABC','XYZ','IJK'))

如下所示:

> match_df
  match name
1     1  ABC
2     2  XYZ
3     3  IJK

将列 、 中的值 1、2、3 替换为 in(将值 0 保留为 )的最佳方法是什么?match1match2match3all_matchesmydfnamesmatch_dfNA

到目前为止,我正在 for 循环中合并到感兴趣的每列,但我相信这可以在一行代码中做得更好。match_dfmydf

任何帮助表示赞赏!谢谢!

R 数据帧 替换 合并 匹配

评论


答:

4赞 Onyambu 2/6/2023 #1
mydf %>%
  mutate(across(contains('match'),~recode(.x,!!!deframe(match_df))))

   id      value match1 match2 match3 all_matches
1   A 0.26767526    ABC   <NA>   <NA>        <NA>
2   B 0.97451868    ABC   <NA>    IJK         IJK
3   C 0.17552913    ABC    XYZ    IJK        <NA>
4   D 0.05055217   <NA>    XYZ   <NA>        <NA>
5   E 0.22828698   <NA>   <NA>   <NA>         ABC
6   F 0.02552021   <NA>    XYZ    IJK         ABC
7   G 0.20669794    ABC    XYZ   <NA>         XYZ
8   H 0.64452351   <NA>    XYZ    IJK         XYZ
9   I 0.34211015   <NA>   <NA>    IJK         IJK
10  J 0.43025045    ABC   <NA>   <NA>         ABC
2赞 Maël 2/6/2023 #2

单行:match

mydf[-c(1,2)] <- match_df$name[match(unlist(mydf[-c(1,2)]), match_df$match)]

输出

#    id      value match1 match2 match3 all_matches
# 1   A 0.17599087    ABC   <NA>   <NA>        <NA>
# 2   B 0.45899500   <NA>    XYZ   <NA>         XYZ
# 3   C 0.12762547    ABC   <NA>   <NA>         XYZ
# 4   D 0.67893265   <NA>    XYZ    IJK         IJK
# 5   E 0.64393827   <NA>   <NA>   <NA>        <NA>
# 6   F 0.93755603   <NA>   <NA>   <NA>         ABC
# 7   G 0.70161939    ABC    XYZ   <NA>        <NA>
# 8   H 0.81897072   <NA>   <NA>    IJK         XYZ
# 9   I 0.26734462   <NA>    XYZ    IJK         ABC
# 10  J 0.03569294   <NA>    XYZ    IJK        <NA>
# 11  K 0.08168074   <NA>   <NA>    IJK         IJK
# 12  L 0.67863032   <NA>   <NA>    IJK         ABC
# 13  M 0.79585738   <NA>    XYZ   <NA>         IJK
# 14  N 0.48506734    ABC    XYZ   <NA>         IJK
# 15  O 0.56177191    ABC   <NA>    IJK        <NA>
# 16  P 0.50113968    ABC    XYZ   <NA>        <NA>
# 17  Q 0.74527715   <NA>   <NA>   <NA>         XYZ
# 18  R 0.64572526   <NA>   <NA>   <NA>        <NA>
# 19  S 0.27640699   <NA>    XYZ    IJK         XYZ
# 20  T 0.76158656   <NA>    XYZ   <NA>         XYZ
# 21  U 0.44533420   <NA>   <NA>    IJK         IJK
# 22  V 0.17232906   <NA>   <NA>    IJK        <NA>
# 23  W 0.87758234    ABC    XYZ   <NA>         ABC
# 24  X 0.15478237   <NA>   <NA>    IJK        <NA>
# 25  Y 0.80055561   <NA>    XYZ    IJK         XYZ
# 26  Z 0.80190420    ABC   <NA>    IJK         ABC

评论

1赞 DaniCee 2/7/2023
接受这个答案,因为我更熟悉所使用的功能,谢谢!