【问题标题】:Add/Merge/Melt only specific columns and give out one unique row仅添加/合并/融化特定列并给出一个唯一行
【发布时间】:2021-12-04 17:47:55
【问题描述】:

我正在尝试转换在某个日期具有多个产品销售的数据集。最后,我只想保留包含每天产品销售额总和的唯一列。

我的 MRE:

df <- data.frame(created = as.Date(c("2020-01-01", "2020-01-01", "2020-01-02", "2020-01-02", "2020-01-03", "2020-01-03"), "%Y-%m-%d", tz = "GMT"),
                soldUnits = c(1, 1, 1, 1, 1, 1),
Weekday = c("Mo","Mo","Tu","Tu","Th","Th"),
Sunshinehours = c(7.8,7.8,6.0,6.0,8.0,8.0))

看起来像这样:

       Date   soldUnits Weekday Sunshinehours
     2020-01-01   1       Mo      7.8
     2020-01-01   1       Mo      7.8
     2020-01-02   1       Tu      6.0
     2020-01-02   1       Tu      6.0
     2020-01-03   1       We      8.0
     2020-01-03   1       We      8.0

变换后应该是这样的:

       Date   soldUnits Weekday Sunshinehours
     2020-01-01   2      Mo      7.8
     2020-01-02   2      Tu      6.0
     2020-01-03   2      We      8.0
     

我尝试了aggregate()group_by,但没有成功,因为我的数据被删除了。

有没有人知道如何根据我提到的规范转换和清理我的数据集?

【问题讨论】:

    标签: r dplyr data-analysis


    【解决方案1】:

    这可以工作:

    library(tidyverse)
    
    df %>%
      group_by(created) %>% 
      count(Weekday, Sunshinehours, wt = soldUnits,name = "soldUnits")
    #> # A tibble: 3 × 4
    #> # Groups:   created [3]
    #>   created    Weekday Sunshinehours soldUnits
    #>   <date>     <chr>           <dbl>     <dbl>
    #> 1 2020-01-01 Mo                7.8         2
    #> 2 2020-01-02 Tu                6           2
    #> 3 2020-01-03 Th                8           2
    

    reprex package (v2.0.1) 于 2021-12-04 创建

    【讨论】:

    • 效果很好,非常感谢!
    【解决方案2】:

    可以使用collap 对不同的列(或一组列)应用不同的功能

    library(collapse)
    collap(df, ~ created + Weekday, 
        custom = list(fmean = "Sunshinehours", fsum = "soldUnits"))
         created soldUnits Weekday Sunshinehours
    1 2020-01-01         2      Mo           7.8
    2 2020-01-02         2      Tu           6.0
    3 2020-01-03         2      Th           8.0
    

    【讨论】:

    • 这也是一个很好的解决方案! Collapse 似乎是一个很棒的库,谢谢提及。
    【解决方案3】:

    另一个dplyr 方法:

    df %>% 
      group_by(created, Weekday, Sunshinehours) %>% 
      summarise(soldUnits = sum(soldUnits))
    
      created    Weekday Sunshinehours soldUnits
      <date>     <chr>           <dbl>     <dbl>
    1 2020-01-01 Mo                7.8         2
    2 2020-01-02 Tu                6           2
    3 2020-01-03 Th                8           2
    

    【讨论】:

      【解决方案4】:

      使用basedplyr R

      df1 = aggregate(df["Sunshinehours"], by=df["created"], mean)
      df2 = aggregate(df["soldUnits"], by=df["created"], sum)
      df3 = inner_join(df1, df2)
      
      #converting `Weekday` to factors 
      df$Weekday = as.factor(df$Weekday)
      df3$Weekday = levels(df$Weekday)
           created Sunshinehours soldUnits Weekday
      1 2020-01-01           7.8         2      Mo
      2 2020-01-02           6.0         2      Th
      3 2020-01-03           8.0         2      Tu
      

      【讨论】:

      • innrer_join 来自dplyr
      • 我尝试转换和清理的只是一个数据帧,为什么在您的解决方案中使用 3 个数据帧?
      猜你喜欢
      • 2019-04-03
      • 2012-08-31
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2015-03-29
      • 2018-07-26
      • 1970-01-01
      相关资源
      最近更新 更多