【问题标题】:How to print the minimum and maximum of factor level summary statistics (taking minimum and maximum of medians/proportions)?如何打印因子水平汇总统计的最小值和最大值(取中位数/比例的最小值和最大值)?
【发布时间】:2020-09-12 11:50:32
【问题描述】:

我有如下数据,包括 10 个产品(a、b、c、...),以及它们的描述(其他变量)。

我需要报告产品之间其他变量(中位数/比例)的汇总统计数据范围(应打印为每个汇总统计值的最小值和最大值)。

例如:

哪个产品的中位价最低,哪个最高(只需要报告两个值,产品名称无关紧要)。

哪个产品的“差”评级比例最低和最高(只需报告两个值,产品名称无关紧要)。

有没有简单的编码方法?我的实际数据有 10,000 种产品和 150 个其他变量,目测汇总表会害死我。

数据

```{r}
data.frame(
product = rep(letters[1:10], each = 2, times = 500),
price = rnorm(1000, 100, 30),
weight = rnorm(1000, 8, 2),
price_category = rep(c("expensive", "cheap"), each = 4, times = 250),
rating = replicate(1,sample(c("good", "bad"),1000,rep=TRUE)))
```

【问题讨论】:

    标签: r summary summarize


    【解决方案1】:

    您可以查看dplyr 包,这样可以轻松回答此类问题。

    1. 哪个产品的中位价最低,哪个中位价最高
    library(dplyr)
    df %>%
      group_by(product) %>%
      summarise(median_price = median(price)) %>%
      slice(which.min(median_price), which.max(median_price))
    
    #  product median_price
    #  <chr>          <dbl>
    #1 f               91.9
    #2 e              107. 
    
    1. 哪个产品的“差”评级比例最低和最高
    df %>%
      group_by(product) %>%
      summarise(prop_of_bad_ratings = mean(rating == 'bad')) %>%
      slice(which.min(prop_of_bad_ratings), which.max(prop_of_bad_ratings))
    
    #  product prop_of_bad_ratings
    #  <chr>                 <dbl>
    #1 j                      0.44
    #2 c                      0.55
    

    【讨论】:

    • 谢谢!这似乎很有希望。只有两件事。有没有办法一次总结所有连续变量?其次,“评分”是一个分类变量。如何获取每个产品的好评与差评的比例,然后报告它们的最小值和最大值?
    • 总而言之,您的意思是全部接受median 吗?您可以为此使用df %&gt;% group_by(product) %&gt;% summarise(across(where(is.numeric), median))。对于第二个问题,您也可以对'good' 评分执行与上述答案 2 相同的操作,然后根据需要合并结果。
    【解决方案2】:

    您也可以使用数据表。 := 运算符通过使用 by 在价格列上分组来进行就地分配(在本例中创建一个新的中位数列) 争论。然后你可以找到最小值和最大值。 .N 运算符获取数据值个数的计数。

    library(data.table)
      
    dt <- data.table(data.frame(
        product = rep(letters[1:10], each = 2, times = 500),
        price = rnorm(1000, 100, 30),
        weight = rnorm(1000, 8, 2),
        price_category = rep(c("expensive", "cheap"), each = 4, times = 250),
        rating = replicate(1,sample(c("good", "bad"),1000,rep=TRUE))))
      
    dt[, medians := median(price), by=product]
    
    # Highest and lowest median price
    dt[c(which.min(medians), which.max(medians)), medians]
    
    # Calculate proportions of each product
    dt[, prodcount := .N, by=product]
    dt[, percent := 100 * (.N / prodcount), by=.(rating, product)]
    bad <- dt[rating == 'bad',]
    bad[c(which.min(percent), which.max(percent))]
    

    【讨论】:

      猜你喜欢
      • 2014-11-20
      • 2015-02-20
      • 2022-11-21
      • 1970-01-01
      • 2018-10-30
      • 2014-04-10
      • 2023-03-31
      • 2020-03-01
      • 2020-09-19
      相关资源
      最近更新 更多