2016-11-10 10 views
1
df = data.frame(week = as.factor(rep(c(1, 2), times = 5)), 
       name = as.factor(rep(LETTERS[1:5], times = 2)), 
       count = rpois(n = 10, lambda = 20)) 

    > df 
    week name count 
1  1  A 16 
2  2  B 14 
3  1  C 23 
4  2  D 15 
5  1  E 12 
6  2  A 15 
7  1  B 23 
8  2  C 22 
9  1  D 22 
10  2  E 26 

週ごとの各名前のカウントシェアを計算したいと思います。 は、最初に私は次のメソッドを使用するつもりだった。列内のカテゴリごとのシェアを計算する方法は?

transform(df, week1_share = ifelse(week == "1", round((df$count/sum(df$count) * 100),2), NA)) 
transform(df, week2_share = ifelse(week == "2", round((df$count/sum(df$count) * 100),2), NA)) 

をしかし、最終的にバープロットのラベルとしてそれを置くために、マージする各列を作り、あまりにも非効率的なように見えました。私はまだ知っていないこれのためのいくつかのタイプの迅速な解決策がなければならない。

基本的に私がしたいのは次のとおりですが、上記のように計算された可能性がある%を各ボックス内で一致させるように追加します。

ggplot(df, aes(reorder(week, -count),count, color = "white", group = name, fill = name))+ 
     geom_bar(position = "stack", stat = "identity") + 
     scale_y_continuous(labels=comma)+ 
     ggthemes::scale_color_tableau() 

enter image description here

リオーダー機能は、多くの場合、私に失敗した理由を私は知りません。 desc内で注文を並べ替えるヒントがあれば、分かち合ってください。

+0

あなたは '(〜名、DF、機能(I)のラウンドを(私は100 /合計(i)を* 2)カウント)'集計を意味ですか? " – Sotos

+0

"週当たりのカウントシェアでは、次のように指定できます:df $ new < - (df、ave(count、name、FUN = function(i)(round(i * 100/sum(i)、2))))) dplyrを使用して週単位でグループ化し、列を追加するために突然変異させます。こんにちは、良い質問、あなたはあなたの誤植を修正することができます: 'data_frame'' 'ライブラリ(dplyr)'と 'df < - mutate(group_by(df、week)、round(count/sum(count)* 100,2))' –

+0

'data.frame'の代わりに、データをコピー&ペーストする人々に適しています。 – snaut

答えて

1

あなたによって提供されたデータが使用されています:

# Loading the required data 
df = data.frame(week = as.factor(rep(c(1, 2), times = 5)), 
       name = as.factor(rep(LETTERS[1:5], times = 2)), 
       count = rpois(n = 10, lambda = 20)) 

plyrパッケージ機能、割合と相対を使用してラベリングのための位置が計算された。

#Loading the required packages  
library(plyr) 
library(ggplot2) 

# Calculating the percentages 
df = ddply(df, .(week), transform, percent = round(count/sum(count) * 100)) 

# Calculating the position for plotting 
df = ddply(df, .(week), transform, pos = cumsum(percent) - (0.5 * percent)) 

上記の計算された情報を使用して、プロットが行われました。

# Basic graph 
p10 <- ggplot() + geom_bar(aes(y = percent, x = week, fill = name), 
         data = df, stat="identity") 

# Adding data labels 
p10 <- p10 + geom_text(data=df, aes(x = week, y = pos, 
           label = paste0(percent,"%")), size=4) 
p10 

これはあなたが探していたものですか?

enter image description here

+0

これはまさに私が探していたものでした。どうもありがとうございます!私は何か新しいことを学んだ! – tmhs

+0

私は余分な質問があります。"#プロット位置の計算"は、ラベルをボックスの中央に配置する方法ですか?これはどのように作動しますか?読んで参考にしてもらえますか? – tmhs

+0

各グループ内の累積合計、ここでは「週」を計算するために使用されます。 ggplotプロットコンテキスト[1](http://stackoverflow.com/a/15844938/4836511)でcumsumを使用して、[cumsum](http://stackoverflow.com/a/16850230/4836511) 、[2](http://stackoverflow.com/a/15768612/4836511)。 – Prradep

2
splitを用い

基地R中の溶液、unsplitprop.tableは次のようになります

バック分割によって生成されるリストtogeter短い split 2番目の引数にaccorting data.frames分割のリスト、非分割プットにおいて
df2 <- unsplit(lapply(split(df, df$week), 
        function(x){ 
        x$prop <- prop.table(x$count) 
        x} 
       ), df$week) 

data.tableパッケージを使用

が、これはさらに短いです:

library(data.table) 
dt <- data.table(df) 
dt[, prop := prop.table(count), by=week] 

私はdplyrには本当に流暢ないんだけど、私は非常に短く、まっすぐ進むのソリューションもありだと確信しています。

編集:これは私がdplyr/magrittrに思い付いたものです:

library(dplyr) 
df3 <- df %>% 
    group_by(week) %>% 
    mutate(freq = prop.table(count)) 
+0

私はまた、dplyrにdata.tableを使用することを好む。あなたの知識を共有していただきありがとうございます! – tmhs

関連する問題