我有一个如下的数据集:
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
我很难找到解决这个问题的方法,尤其是第二部分,说明哪种介质属于该组。 有什么建议或提示吗? 谢谢
答案 0 :(得分:4)
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
答案 1 :(得分: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