【问题标题】:count rows per condition from another data frame计算来自另一个数据帧的每个条件的行数
【发布时间】:2020-09-11 20:37:11
【问题描述】:

我正在尝试使用 R 进行一个私人项目。 以下问题:

我有两个数据框。以两个框架的表格为例:

第一帧

          Home           Away
1         Lens       Paris SG
2 Rapid Vienna         Admira
3         LASK Austria Vienna
4 Shijiazhuang     Wuhan Zall
5  Sonderjyske    Midtjylland
6    Bohemians      Waterford

第二帧

# A tibble: 6 x 9
  Country League  Date       Home               Away                HG    AG Res      TG
  <chr>   <chr>   <chr>      <chr>              <chr>            <dbl> <dbl> <chr> <dbl>
1 Mexico  Liga MX 10/09/2020 Santos Laguna      U.N.A.M.- Pumas      1     2 A         3
2 Mexico  Liga MX 10/09/2020 Mazatlan FC        Club Tijuana         1     0 H         1
3 Mexico  Liga MX 10/09/2020 Cruz Azul          Pachuca              1     0 H         1
4 Mexico  Liga MX 09/09/2020 Club Leon          U.A.N.L.- Tigres     1     1 D         2
5 Mexico  Liga MX 09/09/2020 Puebla             Club America         2     3 A         5
6 Mexico  Liga MX 09/09/2020 Guadalajara Chivas Queretaro            1     1 D         2

现在我想在第一个数据框中插入一个新列,该列从第二个数据框中排除并计算直接遭遇的次数,即 Home == Home Team 和 Away == AwayTeam。是否可以在链接到来自另一个数据帧的数据的数据帧中插入数据?

【问题讨论】:

    标签: r dataframe dplyr purrr


    【解决方案1】:

    我们可以使用data.table 连接on 列,同时获取频率计数

    library(data.table)
    setDT(df_2)[df_1, .N, on = .(home, away), by = .EACHI]
    #   home away N
    #1:    a    c 2
    #2:    b    a 0
    #3:    c    b 1
    

    或者使用base Rtable

    df_1$Count <-  with(df_2, table(factor(paste(home, away),
            levels = unique(paste(df_1$home, df_1$away)))))
    

    数据

    df_2 <- structure(list(home = c("a", "a", "c", "b"), away = c("c", "c", 
    "b", "c")), class = "data.frame", row.names = c(NA, -4L))
    
    df_1 <- structure(list(home = c("a", "b", "c"), away = c("c", "a", "b"
    )), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

      【解决方案2】:

      是的,您可以计算第二个 data.frame 中的遭遇,然后将其与第一个 data.frame 连接:

      df_1 <- data.frame(
        home = c("a", "b", "c"),
        away = c("c", "a", "b")
      )
      
      df_1
      #>   home away
      #> 1    a    c
      #> 2    b    a
      #> 3    c    b
      
      df_2 <- data.frame(
        home = c("a", "a", "c", "b"),
        away = c("c", "c", "b", "c")
      )
      
      df_2
      #>   home away
      #> 1    a    c
      #> 2    a    c
      #> 3    c    b
      #> 4    b    c
      
      library(dplyr)
      
      df_2_stats <- df_2 %>% 
        group_by(home, away) %>% 
        summarise(number_encounters = n())
      #> `summarise()` regrouping output by 'home' (override with `.groups` argument)
      
      df_2_stats
      #> # A tibble: 3 x 3
      #> # Groups:   home [3]
      #>   home  away  number_encounters
      #>   <chr> <chr>             <int>
      #> 1 a     c                     2
      #> 2 b     c                     1
      #> 3 c     b                     1
      
      df_1 <- df_1 %>% 
        left_join(df_2_stats, by = c("home", "away"))
      
      df_1
      #>   home away number_encounters
      #> 1    a    c                 2
      #> 2    b    a                NA
      #> 3    c    b                 1
      

      reprex package (v0.3.0) 于 2020-09-11 创建

      【讨论】:

        猜你喜欢
        • 2018-01-09
        • 1970-01-01
        • 2013-06-14
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-22
        • 2018-04-27
        相关资源
        最近更新 更多