2017-08-24 35 views
1

たとえば、company1に "lenovo"製品と "dell"製品があるデータセットを取得しようとしています。私はこのデータセットの各部分を、「これらはlenovoのお客様(lenovo == 1だった)、でものいずれかにdell製品を持っているか、またはsamsung製品を持っているか、あるいはlenovo製品しか持っていないことを示しています。可能であれば積み重なった棒グラフやファセットグリッドで表示することをお勧めします理想的なチャートは、各製品を単一のバーとして表示します。バーは、顧客が含む他の製品の数で表されます。ggplot2棒グラフ内のグループ化

例えば、100人のlenovo顧客がおり、20人にdellがあり、25人にリンゴがあり、10人にsamsungがある場合(これらの一部が重複する可能性があることに留意してください。サムスン dellとそれは20 foでカウントされますr dell、samsungの10)、バーはdellの色が20色、リンゴの色が25色、samsungの色が10色、残りは追加製品なしのlenovoの色が付いていることを示します。 - そして、それがデルのために複製されるだろう、とDellの顧客のどれが他のグループとの製品を持っていた...など

再現性のあるデータ:

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) 

私のような何かをしようとしているに掘ってきました:データは行ごとだったとお客様がデルとアップルとサムスンであった場合、彼らは3線で表現されるところ、私はこれを行うにしようとしていた

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) 

他の方法でした。そうすれば、私はその製品によってファセットできるでしょう。問題は、リンゴを持っている顧客のabcd1のこの1行にsamsungとdellがあり、それを視覚化していることを示すのが難しいことです。

ご協力いただきましてありがとうございます。

答えて

2

は、整然としたデータフレームを取り、ワイドな行列操作を行い、それを再整理するために設計されています。ここではまずデータを整理し、各製品を列として作成し、各顧客の所有権のバイナリステータスを持つ列を作成します。次に、 "does not have"行(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

あなたは計算された各グループ(Apple製品を所有しているアップルの所有者)の大きさは、その後diag = Fdiag = Tを変更したくない場合。

+0

これは素晴らしいブライアンです!視覚化ではなく、データをどのように表現しているのかという問題は、3つの製品を所有している場合、6つのユニークなペアごとに6回繰り返されますバージョン。そのアカウントがdellとlenovoと共有している場合、リンゴは同じアカウントを2度表示します。これの周りの任意のアイデアですか? –

+0

それはあなたの比較の全体的な考えですね。あなたはこれらの6つのペアのどれを表示したくないですか?それでも情報のすべてをキャプチャする唯一の方法は、アップルの所有者がヒートマップのような他のカテゴリの所有者である可能性を計算するようなことです。次に、ここに表示されるグループ全体のサイズを無視します。 – Brian

+0

それは、比較の一種の考えです...それは、存在する実際のアカウントを過大評価します。私がそれで実現している問題は、あなたが過度なことになる色としてあらゆる組み合わせの順列を必要とすることです。 8000のアカウントがあり、7000個に1個の他の製品があり、1000個に2個の他の製品がある場合、結果には9000個のアカウントが表示され、7000個が1つに着色され、1000個が複製されて、その重複(私は今気づいています)は、8000ではなく9000のアカウントがあるように見えるので問題です。あなたは答えが完璧でした。 –

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() 
関連する問題