2016-10-22 169 views
0

我有以下數據框:在數據幀創建百分比新列

dput(df1) 

structure(list(month = c(1, 1, 2, 2, 3, 4), transaction_type = c("AAA", 
"BBB", "BBB", "CCC", 
"DDD", "AAA"), max_wt_per_month = c(54.9, 
51.6833333333333, 52.3333333333333, 49.4666666666667, 49.85, 
48.5833333333333), min_wt_per_month = c(0, 0, 0, 0, 0, 0), avg_wt_per_month = c(8.41701333107861, 
7.65211141060198, 6.44184012508551, 7.74798927613941, 7.4360566888844, 
7.50611319574734), prop = c(Inf, Inf, Inf, Inf, Inf, Inf)), .Names = c("month", 
"transaction_type", "max_wt_per_month", "min_wt_per_month", "avg_wt_per_month", 
"prop"), row.names = c(NA, -6L), class = c("grouped_df", "tbl_df", 
"tbl", "data.frame"), vars = list(month), drop = TRUE, indices = list(
    0:5), group_sizes = 6L, biggest_group_size = 6L, labels = structure(list(
    month = 1), row.names = c(NA, -1L), class = "data.frame", vars = list(
    month), drop = TRUE, .Names = "month")) 

我想創建列prop將包含的最長等待時間的百分比相對於每個月。如果我運行此代碼,然後我得到Inf值在大多數的行...(尤其是它在真實數據集是顯而易見的):

my_fun=function(vec){ 
    100*as.numeric(vec[3])/
    sum(with(data_merged_transactions, ifelse(month == vec[1], max_wt_per_month, 0))) } 
data_merged_transactions$prop=apply(data_merged_transactions , 1 , my_fun) 

我後來終於需要創建填充區域圖,使每個區域將是一個百分比超出了100%:

ggplot(data_merged_transactions, aes(x=month, y=prop, fill=transaction_type)) + 
    geom_area(alpha=0.6 , size=1, colour="black") 

爲什麼我得到Inf如果總和不等於0? 此外,是否可以創建以月份爲因子(1月,2月等)的填充面積圖,而不是數字?我試圖用月份名稱替換月份ID,但是後來我得到了很細的條而不是填充的區域。

+0

你能給我們提供原始數據幀的輸出嗎?我正在努力導入你發佈的那個?您還可以詳細說明「每月最大等待時間的百分比」與數據集中其他變量的關係? – biomiha

+0

@biomiha:真實的數據集很大。我剛剛發佈了'dput(head(df))'。最大等待時間上的%意味着MAX_WT [AAA,1月]/SUM(MAX_WT [january])',其中max_wt是第3列,AAA是特定行的transaction_type。 – FiofanS

回答

1

這是你在找什麼?

library(tidyverse) 
df1_tidy <- df1 %>% 
       group_by(month) %>% 
       summarise(SUM = sum(max_wt_per_month)) %>% 
       full_join(df1) %>% 
       mutate(prop = max_wt_per_month/SUM) 


ggplot(data = df1_tidy, 
     aes(x = month, 
      y = prop, 
      fill = transaction_type)) + 
    geom_area(alpha = 0.6, 
      size = 1, 
      colour = "black") + 
    scale_x_continuous(labels = c("Jan", "Feb", "Mar", "Apr")) 
+0

是的,對!非常感謝你!有了完整的數據集,它看起來不錯。您能否回答與月份編號有關的其他子問題(X軸)。是否可以顯示月份名稱而不是索引?如果不可能,那麼我怎麼能像1,2,3..12一樣顯示所有月份,但不是像現在這樣顯示2.5,5,7.5? – FiofanS

+0

我認爲重新標記軸是最快/最簡單的。我通過添加'scale_x_continuous(labels = c(「Jan」,「Feb」,「Mar」,「Apr」))'來調整我的答案。現在,顯然在示例數據集中,您只有4個月的時間,所以如果您的整個數據集包含全部12個數據集,請將它們全部添加到標籤向量中。 – biomiha

+0

它提供了一個錯誤'f(...,self = self)中的錯誤:中斷和標籤是不同的長度。我檢查了'df1_tidy'包含了12個月的數據,並且我在'c(「Jan」,「Feb」,...)中放了12個月的名字。你知道爲什麼會發生?看起來我也應該定義中斷的數量。 – FiofanS