R - 将数据框中的值与聚合数据框进行比较

R - Compare values in a dataframe to aggregated dataframe

我正在尝试找出如何逐行比较数据帧中与 aggregate() 函数给出的值相对应的值。

例如:

#create data frame
df <- data.frame(team=c('a', 'a', 'b', 'b', 'b', 'c', 'c'),
                 pts=c(5, 8, 14, 18, 5, 7, 7),
                 rebs=c(8, 8, 9, 3, 8, 7, 4))

#view data frame
df

  team pts rebs
1    a   5    8
2    a   8    8
3    b  14    9
4    b  18    3
5    b   5    8
6    c   7    7
7    c   7    4

#find mean points scored by team
agg_df = aggregate(df$pts, list(df$team), FUN=mean)

  Group.1        x
1       a  6.50000
2       b 12.33333
3       c  7.00000

我想做的是使用类似于以下伪代码的逻辑在 df 中创建一个新列: df$pts[i] > agg_df$x[i] 然后 df$performance = 'overperformed' 否则 df$performance = 'underperformed'.

但这并不是我想要的。我想将第 1 行和第 2 行的分数与 agg_df 中 a 队的平均分数进行比较。同样,df 中的第 3-5 行应与 agg_df.

中 b 组的平均分进行比较

最终结果如下:

> df
  team pts rebs performance
1    a   5    8       under
2    a   8    8        over
3    b  14    9        over
4    b  18    3        over
5    b   5    8       under
6    c   7    7     average
7    c   7    4     average

我对如何实现这一目标感到有些困惑,或者它是否可以实现,因此非常感谢您的帮助。

你可以这样做:

library(tidyverse)
df %>%
  group_by(team) %>%
  mutate(performance = case_when(pts  > mean(pts) ~ "over",
                                 pts == mean(pts) ~ "average",
                                 pts  < mean(pts) ~ "under")) %>%
  ungroup()

给出:

# A tibble: 7 x 4
  team    pts  rebs performance
  <chr> <dbl> <dbl> <chr>      
1 a         5     8 under      
2 a         8     8 over       
3 b        14     9 over       
4 b        18     3 over       
5 b         5     8 under      
6 c         7     7 average    
7 c         7     4 average  

或以 merge() 的基本方式。

# Merge data
db <- merge(df, agg_df, by.x = "team", by.y = 'Group.1')
db$performance <- ifelse(db$pts == db$x, 'average',
                         ifelse(db$pts > db$x, 'over', 'under'))
db$x <- NULL
db