我有一个如下的数据集:
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分组,并对每列的值进行求和,以形成由求和值组成的唯一行。此外,我还想显示每个子组中的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
我很难找到解决这个问题的方法,尤其是第二部分,把哪个媒体放在组中。有什么建议或提示吗?谢谢
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
这是一个创建两个不同数据帧并将它们连接在一起以获得预期输出的想法。第一个是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