【问题标题】:Match two dataframes with different column names and create new column with mean from the other匹配具有不同列名的两个数据框,并创建具有另一个平均值的新列
【发布时间】:2020-01-31 04:09:25
【问题描述】:

我有两个数据框。第一个只列出每个学校/团队一次,如下所示:

classA <- data.frame(School=c("Omaha South", "Millard North", "Elkhorn"))

另一个数据框是整个赛季的篮球得分表,您可以在同一列中多次列出学校/球队:

scores <- data.frame('Away Score'=c(60,84,48,72),
                     'Away Team'=c("Omaha South", "Millard North", "Elkhorn","Elkhorn"),
                     'Home Score'=c(88,40,38,62),
                     'Home Team'=c("Elkhorn", "Omaha South", "Millard North","Omaha South"))

我的目标是创建一个名为 classA$'Away PPG' 的新列,该列对第一个数据框中每个学校的所有“Away 分数”进行平均。因此,对于 Elkhorn,新的 A 类列将是 60 (48+72)/2。

我遇到困难的一个地方是两个 dfs 有不同的列名来匹配,我还没有找到如何处理这方面的问题。

我之前在一个有点相关的问题上获得了帮助,我正在寻找计数而不是平均值,但不知道如何修改它以适用于这个问题。计数问题的solution 如下所示:

df2 %>% 
right_join(df1, by = c('Winner' = 'School')) %>% 
na.omit() %>% 
count(Winner, name = "wins") %>% 
right_join(df1, c('Winner' = 'School')) %>% 
mutate(wins = replace(wins, is.na(wins), 0))

【问题讨论】:

    标签: r join average dplyr


    【解决方案1】:

    我们可以加入classAscores,然后为每个School 占用Away.Score 中的mean

    library(dplyr)
    
    classA %>% 
      left_join(scores, by = c('School' = 'Away.Team')) %>%
      group_by(School) %>%
      summarise(AwayScore = mean(Away.Score, na.rm = TRUE))
    
    # A tibble: 3 x 2
    #  School        AwayScore
    #  <fct>             <dbl>
    #1 Elkhorn              60
    #2 Millard North        84
    #3 Omaha South          60
    

    在基础 R 中类似

    aggregate(Away.Score~School, 
          merge(classA, scores, by.x = 'School', by.y = 'Away.Team'),
          mean, na.rm = TRUE)
    

    【讨论】:

    • 如果我在 classA 中已经有其他列,有没有办法在不删除它们的情况下执行此操作?
    • @JeffSwanson 你可以在最后一行使用mutate 而不是summarise
    • 谢谢,但 mutate 似乎是从 scores 数据框中添加了一堆额外的列和行,我只需要出现一个新列。
    • @JeffSwanson 哪一栏?然后在group_by 中使用它。 group_by(School, other_column).
    • @JeffSwanson 试试scores %&gt;% group_by(Away.Team) %&gt;% summarise(AwayScore = mean(Away.Score, na.rm = TRUE)) %&gt;% right_join(classA, by = c('Away.Team' = 'School'))
    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2021-01-15
    • 2022-10-14
    • 2017-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多