【问题标题】:joining on inexact strings in R在 R 中加入不精确的字符串
【发布时间】:2020-06-05 08:52:07
【问题描述】:

我希望加入两个表。但是我希望加入的数据不完全匹配。加入 NFL 球员姓名。

以下数据集..

> dput(att75a)
structure(list(rusher_player_name = c("A.Ekeler", "A.Jones", 
"A.Kamara", "A.Mattison", "A.Peterson", "B.Hill"), mean_epa = c(-0.110459963350783, 
0.0334332018597805, -0.119488111742492, -0.155261835310445, -0.123485646124451, 
-0.0689611296359916), success_rate = c(0.357664233576642, 0.40495867768595, 
0.401129943502825, 0.283018867924528, 0.322727272727273, 0.35
), plays = c(137L, 242L, 177L, 106L, 220L, 80L)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -6L))

> dput(rb2019capa)
structure(list(rusher_player_name = c("Aaron Jones", "Adrian Peterson", 
"Alexander Mattison", "Alvin Kamara", "Austin Ekeler", "Brian Hill"
), Team = c("Packers", "Redskins", "Vikings", "Saints", "Chargers", 
"Falcons"), `Salary Cap Value` = c(695487, 1780000, 700545, 1050693, 
646668, 645000), `Cash Spent` = c(645000, 2530000, 1317180, 807500, 
645000, 645000)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-6L))

例如,我正在尝试在 Alexander Mattison 上加入 A.Mattison.. 等等..

我尝试了 stringdist 和fuzzyjoin,但无法解决我的问题..

请考虑...采用每个数据集的 head() 来压缩每个问题询问指南。原始数据集的长度为 51 obs。和 168 obs...这会影响连接的执行方式吗?

清理这些名称的最佳方法是什么?

感谢您的宝贵时间..

【问题讨论】:

  • Alexander Mattison 转换为A.Mattison 的代码可以完成这项工作吗?
  • 修改第二个df,将名字替换为第一个首字母。只要没有重复,就应该可以将其与第一个 df 完全结合。
  • 谢谢,我会用字符串来试试这个
  • 那么你尝试了什么?
  • 在另一个帖子中(不应该重复发布)我被建议使用 sub..sub("(.).*\\.(.*)", "\\1.\\2", rb2019capa$rusher_player_name).. 匹配名称后加入成功...我将在下面尝试答案我稍后会回到我的环境中......

标签: r string join data-cleaning stringdist


【解决方案1】:

使用sub 将名字替换为首字母。

library(dplyr)

rb2019capa %>%
  mutate(rusher_player_name=
         sub("^([A-Z])\\S+\\s([A-Za-z].*)$", "\\1.\\2", rusher_player_name)) %>%
  inner_join(att75a, by="rusher_player_name") # or left_join (up to you)

# A tibble: 6 x 7
  rusher_player_name Team     `Salary Cap Value` `Cash Spent` mean_epa success_rate plays
  <chr>              <chr>                 <dbl>        <dbl>    <dbl>        <dbl> <int>
1 A.Jones            Packers              695487       645000   0.0334        0.405   242
2 A.Peterson         Redskins            1780000      2530000  -0.123         0.323   220
3 A.Mattison         Vikings              700545      1317180  -0.155         0.283   106
4 A.Kamara           Saints              1050693       807500  -0.119         0.401   177
5 A.Ekeler           Chargers             646668       645000  -0.110         0.358   137
6 B.Hill             Falcons              645000       645000  -0.0690        0.35     80

【讨论】:

    【解决方案2】:

    将点替换为 % 创建 SQL 模式并根据匹配进行连接。

    library(sqldf)
    
    sqldf("select * 
      from att75a a 
      left join rb2019capa r 
        on r.rusher_player_name like replace(a.rusher_player_name, '.', '%')")
    

    给予:

      rusher_player_name    mean_epa success_rate plays rusher_player_name..5
    1           A.Ekeler -0.11045996    0.3576642   137         Austin Ekeler
    2            A.Jones  0.03343320    0.4049587   242           Aaron Jones
    3           A.Kamara -0.11948811    0.4011299   177          Alvin Kamara
    4         A.Mattison -0.15526184    0.2830189   106    Alexander Mattison
    5         A.Peterson -0.12348565    0.3227273   220       Adrian Peterson
    6             B.Hill -0.06896113    0.3500000    80            Brian Hill
          Team Salary Cap Value Cash Spent
    1 Chargers           646668     645000
    2  Packers           695487     645000
    3   Saints          1050693     807500
    4  Vikings           700545    1317180
    5 Redskins          1780000    2530000
    6  Falcons           645000     645000
    

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 2019-06-02
      • 2021-04-23
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      相关资源
      最近更新 更多