首页 > 解决方案 > 匹配具有不同列名的两个数据框,并创建具有另一个平均值的新列

问题描述

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

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 有不同的列名来匹配,我还没有找到如何处理这方面的问题。

我之前在一个有点相关的问题上得到了帮助,我正在寻找一个计数而不是一个平均值,但无法弄清楚如何修改它以适用于这个问题。计数问题的解决方案如下所示:

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))

标签: rjoinaveragedplyr

解决方案


我们可以加入classAscores然后meanAway.Score每个School.

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)

推荐阅读