Подведите итог в пределах группы dplyr - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть набор данных, как показано ниже:

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

Я пытаюсь сгруппировать по BRAND и суммировать значения по каждому столбцу, чтобы сформировать уникальную строку, состоящую из суммированных значений.Кроме того, я также хотел бы показать, какие СРЕДНИИ были в каждой подгруппе.

Окончательный результат должен быть следующим:

          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

У меня нет времени, чтобы найти способ решитьэто, особенно вторая часть, чтобы определить, какая среда была в группе.Любое предложение или намеки?Спасибо

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Mybe поздно, но вы также можете попытаться управлять им без каких-либо внешних пакетов, в два этапа:

Сначала объедините W... по BRAND:

# 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
0 голосов
/ 01 февраля 2019

Вот идея, которая создает два разных фрейма данных и объединяет их вместе, чтобы получить ожидаемый результат.Первый - агрегация на 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
...