【问题标题】:R - 将数据帧中的值与聚合数据帧进行比较
【发布时间】:2021-12-24 07:25:45
【问题描述】:

我试图弄清楚如何逐行比较数据框中的值,这些值与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] &gt; 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

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

【问题讨论】:

    标签: r dataframe aggregate-functions


    【解决方案1】:

    你可以这样做:

    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  
    

    【讨论】:

      【解决方案2】:

      或者以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
      

      【讨论】:

        猜你喜欢
        • 2019-01-29
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 2016-10-17
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多