【问题标题】:Summarize row values into columns in R将行值汇总到 R 中的列中
【发布时间】:2021-08-20 08:22:25
【问题描述】:

我得到了什么:
一个数据集,指示商店在 100 天内售出的每日商品数量。
因此,商店 1 在第 1 天售出 114 件商品,在第 2 天售出 178 件,依此类推,直到第 100 天售出 143 件商品。
此外,该数据集具有 1000 家此类商店的类似数据。但是,对于某些商店(例如商店 1000),销售计数仅在第 65 天之前可用。

| Store | Day |Count|
| -------- | -------------- |-------|
| 1    | 1            |114|
| 1   | 2            |178|
| ..    | ..            |..|
| 1   | 100           |143|
| 2    | 1            |197|
| 2   | 2            |159|
| ..    | ..            |..|
| 2   | 100           |39|
| 1000    | 1            |53|
| 1000   | 2            |132|
| ..    | ..            |..|
| 1000   | 65           |104|

我需要什么:
将 100 天分为 10 个相等的阶段,即第 1-10 天、第 11-20 天……第 91-100 天。
对于每个商店,找到每个阶段的中位数并在列中报告它们。
对于具有完整 100 天数据(例如 1 和 2)的商店,将有 10 个中位数。 (m_p1, …m_p10)
而其余的则更少,例如商店 1000 将只有 7 个中值。
所需的表(1000 行 - 每个商店 1 行)如下所示:
Store m_p1 m_p2 .. m_p10
1 120 157 .. 123
2 90 140 .. 121
.. .. .. .. ..
1000 45 102 .. NA

【问题讨论】:

    标签: r dplyr data-wrangling


    【解决方案1】:
    library(tidyverse)
    
    #sample data
    set.seed(123)
    df <- data.frame(store = rep(c(1,2), each = 100),
                     day = rep(1:100, 2),
                     Count = sample(80:100, 200, T))
    
    str(df)
    #> 'data.frame':    200 obs. of  3 variables:
    #>  $ store: num  1 1 1 1 1 1 1 1 1 1 ...
    #>  $ day  : int  1 2 3 4 5 6 7 8 9 10 ...
    #>  $ Count: int  94 98 93 82 89 97 90 84 99 93 ...
    
    df %>%
      group_by(store, phase = (1 + ((day - 1) %/% 10))) %>%
      summarise(val = median(Count), .groups = 'drop') %>%
      pivot_wider(names_from = phase, names_prefix = 'm_p', values_from = val)
    
    #> # A tibble: 2 x 11
    #>   store  m_p1  m_p2  m_p3  m_p4  m_p5  m_p6  m_p7  m_p8  m_p9 m_p10
    #>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #> 1     1  93    87.5  91.5  87.5    93  92.5  91.5    90    91  93  
    #> 2     2  87.5  91.5  92    90.5    91  90    88.5    90    91  94.5
    

    【讨论】:

    • 谢谢!您的解决方案也同样有效。接受了罗纳克的回答,因为我只能选择一个,而且他是第一个回复的。
    【解决方案2】:

    您可以创建一组 10 天,计算 median Count 值并获取宽格式数据。

    library(dplyr)
    library(tidyr)
    
    df %>%
      mutate(group = ceiling(Day/10)) %>%
      group_by(Store, group) %>%
      summarise(Count = median(Count), .groups = 'drop') %>%
      pivot_wider(names_from = group, values_from = Count, names_prefix = 'm_p')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多