【问题标题】:Match tables using 2 criteria in R使用 R 中的 2 个条件匹配表
【发布时间】:2020-04-01 16:44:16
【问题描述】:

我刚开始在 R 中编码,我正在尝试操作数据,但我遇到了以下问题: 我有 2 个不同的表(简化) 第一个(player_df)如下:

 name   experience      Club        age       Position 
 luc          2         FCB         18        Goalkeeper
 jean         9         Real        26        midfielder
 ronaldo      14        FCB         32        Goalkeeper
 jean         9         Real        26        midfielder
 messi        11        Liverpool   35        midfielder
 tevez        6         Chelsea     27        Attack
 inzaghi      9         Juve        34        Defender
 kwfni        17        Bayern      40        Attack
 Blabla       9         Real       25        midfielder
 wdfood      11        Liverpool   33        midfielder
 player2      7         Chelsea     28       Attack
 player3     10         Juve       34        Defender
 fgh         17        Bayern      40        Attack
...

第二张表是按俱乐部和经验分的薪水,单位是百万(salary_df

*experience    FCB   BAYERN    Juve   Real  Chelsea 
1               1.5   1.3     1      4      3
2               2.5   2       2.4    5      4
3               3.4   3.1     3.5    6.3    5
4               5     4.5     6.7     9     6
5               7.1   6.9     9      12     7
6               9      8      10     15     10
7               10     9      12     16     15
8               14     12     13     19     16
9               14.5   17     15     20     17
10              15     19     17     23     18
..*

我想在名为 let say salary_estimation 的第一个表中为我的数据添加一个新列,其中考虑了 2 个变量,例如 experienceclub

例如对于在“FCB”打球并有“2”年经验的“luc”,输出应该是“2.5”

在 excel 中它是一个索引/匹配函数,但在 R 中我不知道应该使用哪个函数。

我应该如何解决这个问题?

【问题讨论】:

    标签: r join merge


    【解决方案1】:

    数据:

    df1 <- read.table(text = 'name   experience      Club        age       Position 
     luc          2         FCB         18        Goalkeeper
                     jean         9         Real        26        midfielder
                     ronaldo      14        FCB         32        Goalkeeper
                     jean         9         Real        26        midfielder
                     messi        11        Liverpool   35        midfielder
                     tevez        6         Chelsea     27        Attack
                     inzaghi      9         Juve        34        Defender
                     kwfni        17        Bayern      40        Attack
                     Blabla       9         Real       25        midfielder
                     wdfood      11        Liverpool   33        midfielder
                     player2      7         Chelsea     28       Attack
                     player3     10         Juve       34        Defender
                     fgh         17        Bayern      40        Attack', header = TRUE, stringsAsFactors = FALSE)
    
    df2 <- read.table(text = 'experience    FCB   BAYERN    Juve   Real  Chelsea 
    1               1.5   1.3     1      4      3
                      2               2.5   2       2.4    5      4
                      3               3.4   3.1     3.5    6.3    5
                      4               5     4.5     6.7     9     6
                      5               7.1   6.9     9      12     7
                      6               9      8      10     15     10
                      7               10     9      12     16     15
                      8               14     12     13     19     16
                      9               14.5   17     15     20     17
                      10              15     19     17     23     18', header = TRUE, stringsAsFactors = FALSE)
    

    代码:

    library('data.table')
    setDT(df2)[, Chelsea := as.numeric(Chelsea)]
    df2 <- melt(df2, id.vars = "experience", variable.name = "Club", value.name = "Salary" )
    df2[df1, on = c("experience", "Club"), nomatch = NA]
    

    输出:

    #    experience      Club Salary    name age   Position
    # 1:          2       FCB    2.5     luc  18 Goalkeeper
    # 2:          9      Real   20.0    jean  26 midfielder
    # 3:         14       FCB     NA ronaldo  32 Goalkeeper
    # 4:          9      Real   20.0    jean  26 midfielder
    # 5:         11 Liverpool     NA   messi  35 midfielder
    # 6:          6   Chelsea   10.0   tevez  27     Attack
    # 7:          9      Juve   15.0 inzaghi  34   Defender
    # 8:         17    Bayern     NA   kwfni  40     Attack
    # 9:          9      Real   20.0  Blabla  25 midfielder
    # 10:         11 Liverpool     NA  wdfood  33 midfielder
    # 11:          7   Chelsea   15.0 player2  28     Attack
    # 12:         10      Juve   17.0 player3  34   Defender
    # 13:         17    Bayern     NA     fgh  40     Attack
    

    【讨论】:

      【解决方案2】:

      一种可能的解决方案是使用experienceclub 作为键,将第一个表(假设它是player_df)与第二个表salary_df 的“长格式”连接起来。您可以使用tidyverse 包来实现。

      library(tidyverse)
      
      player_df %>%
        mutate(Club = str_to_title(Club)) %>%
        left_join(
            salary_df %>% 
              pivot_longer(-experience, names_to = "Club", values_to = "salary_estimation") %>%
              mutate(Club = str_to_title(Club)) )
      
      # Joining, by = c("experience", "Club")
      # # A tibble: 13 x 6
      #    name    experience Club        age Position   salary_estimation
      #    <chr>        <dbl> <chr>     <dbl> <chr>                  <dbl>
      #  1 luc              2 Fcb          18 Goalkeeper               2.5
      #  2 jean             9 Real         26 midfielder              20  
      #  3 ronaldo         14 Fcb          32 Goalkeeper              NA  
      #  4 jean             9 Real         26 midfielder              20  
      #  5 messi           11 Liverpool    35 midfielder              NA  
      #  6 tevez            6 Chelsea      27 Attack                  10  
      #  7 inzaghi          9 Juve         34 Defender                15  
      #  8 kwfni           17 Bayern       40 Attack                  NA  
      #  9 Blabla           9 Real         25 midfielder              20  
      # 10 wdfood          11 Liverpool    33 midfielder              NA  
      # 11 player2          7 Chelsea      28 Attack                  15  
      # 12 player3         10 Juve         34 Defender                17  
      # 13 fgh             17 Bayern       40 Attack                  NA  
      

      【讨论】:

        猜你喜欢
        • 2015-02-09
        • 2019-10-31
        • 2018-10-04
        • 1970-01-01
        • 2022-12-18
        • 1970-01-01
        • 2022-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多