【问题标题】:Summarise within groups dplyr在组内总结 dplyr
【发布时间】:2019-06-26 02:43:28
【问题描述】:

我有一个如下数据集:

BRAND  MEDIUM      W1   W2   W3   W4   W5

   B1   tv          1    0    1    0    2
   B2   tv          0    0    0    0    0
   B1   radio       0    1    2    5    3
   B1   tv          0    0    0    0    0
   B2   radio       0    4    1    1    1
   B1   newspapers  7    4    2    1    0

我要做的是按品牌分组并对每一列的值求和,以形成由求和值组成的唯一行。此外,我还想显示每个子组中的 MEDIUM。

最终输出应该如下:

          W1    W2   W3   W4   W5  tv radio newspaper 

   B1      8    9    5    6    5   1   1       1
   B2      0    4    1    1    1   1   1       0

我很难找到解决这个问题的方法,尤其是在第二部分中,将哪种媒介放在组中。 有什么建议或提示吗? 谢谢

【问题讨论】:

    标签: r group-by dplyr dataset


    【解决方案1】:

    Mybe 晚了,不过你也可以尝试在没有任何外部包的情况下管理它,分两步:

    首先通过BRAND聚合W...

    # aggregate by brand, and not using the MEDIUM column:
    one  <-   aggregate(. ~ BRAND, data = dats[,-2], sum) 
    

    然后是媒介:

    # frequencies
    # EDIT HERE
    # two <- as.data.frame.matrix(table(dats$BRAND,dats$MEDIUM))  
    # replace with ones
    # two[(two)>1] <- 1
    
    # thanks to Ronak Shah
    two <- data.frame(BRAND = unique(dats$BRAND), +(table(dats$BRAND, dats$MEDIUM) > 0))
    

    最后你可以合并两个数据集:

    merge(one, two)
      BRAND W1 W2 W3 W4 W5 newspapers radio tv
    1    B1  8  5  5  6  5          1     1  1
    2    B2  0  4  1  1  1          0     1  1
    

    【讨论】:

    • @Ronak Shah 非常好,已添加!您认为有没有办法使用table() 函数避免two$BRAND &lt;- rownames(two)?我觉得两排太丑了。
    【解决方案2】:

    这是一个创建两个不同数据框并将它们连接在一起以获得预期输出的想法。第一个是BRAND 上的聚合,第二个是对MEDIUM 的聚合,即

    library(tidyverse)
    
    df1 <- df %>% 
        group_by(BRAND) %>% 
        summarise_at(vars(starts_with('W')), funs(sum))
    
    # A tibble: 2 x 6
    #  BRAND    W1    W2    W3    W4    W5
    #  <fct> <int> <int> <int> <int> <int>
    #1 B1        8     5     5     6     5
    #2 B2        0     4     1     1     1
    
    df2 <- df %>% 
        select(BRAND, MEDIUM) %>% 
        group_by(BRAND) %>% 
        mutate(new = 1) %>% 
        distinct() %>% 
        spread(MEDIUM, new, fill = 0)
    
    # A tibble: 2 x 4
    # Groups:   BRAND [2]
    #  BRAND newspapers radio    tv
    #  <fct>      <dbl> <dbl> <dbl>
    #1 B1             1     1     1
    #2 B2             0     1     1
    

    把他们联合起来,得到,

    left_join(df1, df2)
    #Joining, by = "BRAND"
    # A tibble: 2 x 9
    #  BRAND    W1    W2    W3    W4    W5 newspapers radio    tv
    #  <fct> <int> <int> <int> <int> <int>      <dbl> <dbl> <dbl>
    #1 B1        8     5     5     6     5          1     1     1
    #2 B2        0     4     1     1     1          0     1     1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-26
      • 2017-09-14
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多