2017-08-24 144 views
1

我正在寻找一个数据集,例如,company1有“lenovo”产品和“dell”产品。我想打出这个数据集的每个部分来展示“这些是联想客户(分别是联想== 1),这些也有有dell产品,或者也有三星产品,或者只有联想产品。如果可能的话,我希望这会显示在堆积的条形图中,或者如果可能的话,或者面网格。理想的图表会将每个产品显示为一个单独的条形,其中条形根据这些客户包含的其他产品的计数进行着色。ggplot2条形图内的分组

例如,如果有100个联想客户,其中20个也有戴尔,25个也有苹果,其中10个拥有三星,(注意其中有些可能重叠,可能有客户与三星戴尔,这将被计算在20福三星电子有限公司和三星电子股份有限公司),该酒吧将显示20色的戴尔,25色的苹果,10色的三星,其余颜色为联想,没有额外的产品。 - 那么这将被复制戴尔,以及戴尔的客户有产品与其他组..等等

重复性的数据:

a <- paste0("abcd", c(1:185)) 
dell <- sample(c(1, 0, 0), size = 185, replace = TRUE) 
apple <- sample(c(1, 0, 0, 0, 0), size =185, replace = TRUE) 
lenovo <- sample(c(1, 0), size = 185, replace = TRUE) 
samsung <- sample(c(1, 0), size = 185, replace = TRUE) 
df <- data.frame(a, dell, apple, lenovo, samsung) 

我已经挖成试图做类似的东西:

ggplot(df, aes(x = Dell)) + 
    geom_histogram(stat = 'count', position = "dodge") + 
    geom_text(stat = 'count', aes(label = ..count..), position = position_dodge(width = .9), vjust = -1) + 
    scale_y_continuous(labels = comma) 

我试图做的,这是该数据是逐行,如果有与戴尔和苹果和三星客户,他们将通过3线表示的另一种方式。这样我可以通过产品facet_grid。问题是,我很难表明,这一行的客户abcd1有苹果,也有三星和戴尔,并形象化。

任何帮助表示赞赏!

回答

2

The widyr package被设计用于拍摄整齐数据帧,执行广矩阵操作,并重新整理它。在这里,我首先整理您的数据,创建一个列,每个产品作为行,并为每个客户创建一个具有所有权二进制状态的列。然后放下“没有”行(hasproduct != 0),并对所有产品进行配对计数。

library(tidyr) 
library(widyr) 
library(ggplot2) 
library(dplyr) 

data_frame(a = paste0("abcd", c(1:185)), 
      dell = sample(c(1, 0, 0), size = 185, replace = TRUE), 
      apple = sample(c(1, 0, 0, 0, 0), size = 185, replace = TRUE), 
      lenovo = sample(c(1, 0), size = 185, replace = TRUE), 
      samsung = sample(c(1, 0), size = 185, replace = TRUE)) %>% 
    gather(key = product, value = hasproduct, -a) %>% 
    filter(hasproduct != 0) %>% 
    widyr::pairwise_count(product, a, diag = T) %>% 
    ggplot(aes(item1, n, fill = item2)) + 
    geom_col(position = "stack") 

enter image description here

如果你不希望每个组计算的大小(谁拥有苹果产品苹果拥有者),然后更改diag = Tdiag = F

+0

这是优秀的布赖恩谢谢你!唯一的障碍我碰上这种情况,这是比较我如何表示数据,而不是可视化的问题在于,当一个人拥有3种产品的情况下,它会复制它的6倍,因为将有6独特配对版本。意思是说,如果该帐户与戴尔和联想共享,苹果将拥有同一帐户两次。有关于此的任何想法? –

+0

这就是你比较的全部想法,不是吗?这6对中的哪一对你不想显示?仍然捕捉所有的信息,唯一的选择是做类似计算,一个苹果所有者也是互相类别,这可能是一个热图的所有者的概率。然后,您忽略整体组大小,如下所示。 – Brian

+0

这是比较的想法,种类...它夸大了存在的实际账户。我正在意识到的问题是,您需要将每种组合的排列组合为一种颜色,否则这些颜色会过度杀伤。如果有8000个账户,7000个有1个其他产品,1000个有2个其他产品,结果将显示9000个账户,7000个彩色作为一个事物,1000个重复显示另外两个产品。这种重复(我现在意识到)是一个问题,因为它看起来有9000个账户而不是8000个。你的回答是完美的顺便说一句,这是我的使用,很难。 –

0

这是你指的第一个?如果是这样,让我知道,我会编辑和解释。

library(tidyverse) 
library(rlang) 

computers <- c("dell", "apple", "lenovo", "samsung") 


all_dfs <- 
    map(computers, ~ { 
    df %>% 
     gather(computer, count, !!.x) %>% 
     gather(cat, value, setdiff(computers, !!.x)) %>% 
     mutate(cat = ifelse(count == 0, "they use same company", cat)) 
    }) %>% 
    reduce(bind_rows) 

all_dfs %>% 
    ggplot(aes(computer, fill = cat)) + 
    geom_bar()