2016-02-26 27 views
2

第一組元素可能是一個簡單的答案,但令人驚訝的證明具有挑戰性。我的數據看起來像發生在三年以下的,國家明智的百分比:排序dplyr

State<-c('Assam','Bihar','Chandigarh','Delhi','Goa') 
2012<-c(96, 95, 94, 92, 99) 
2013<-c(97, 97, 94, 93, 100) 
2014<-c(97, 98, 96, 95, 100) 

df<-data.frame(State, 2013, 2013, 2014) 

我想這組由國家,安排年,然後通過上升2012個百分比排列狀態組。還需要一個單獨的DF,將按2014年的百分比安排狀態。

這是我有:

library(reshape2) 
library(dplyr) 

dfmelt<-melt(df, id = 'State') 
colnames(dfmelt)<-c('State','Year','Percent') 

dfmelt<-dfmelt %>% arrange(Percent) %>% group_by(State) %>% arrange(Year) 

嘗試最後一行的萬種組合和無法破解它。看過類似的問題,但沒有總結或突變,只是純粹的重新安排,我卡住了。

最終我在2012年創建%2個圖,Y軸排名第一狀態「s和一個2014年%的。圖I需要按照ggplot的確切順序執行此操作,對吧?如果我錯了,請告訴我。

謝謝!

+0

數據好好嘗試一下工作 - 你不能數的矢量分配到另一個號碼:'2012 < - C(96,95,......)' – SymbolixAU

回答

2

你的數據創建代碼不能運行,你有2013多次。

這裏是產生數據的代碼:

State <- c('Assam','Bihar','Chandigarh','Delhi','Goa') 
p2012 <- c(96, 95, 94, 92, 99) 
p2013 <- c(97, 97, 94, 93, 100) 
p2014 <- c(97, 98, 96, 95, 100) 
df <- data.frame(State, p2012, p2013, p2014) 

然後,您可以執行以下操作來接收數據幀(長格式)國家集團在2012個的順序進行排序:

library(dplyr) 
library(tidyr) 
df %>% 
    gather(Year, Percentage, -State) %>% 
    group_by(State) %>% 
    mutate(Percentage2012 = Percentage[Year == 'p2012']) %>% 
    ungroup() %>% 
    arrange(Percentage2012, State, Year) %>% 
    select(-Percentage2012) 

所得數據幀如下:

Source: local data frame [15 x 3] 

     State Year Percentage 
     (fctr) (fctr)  (dbl) 
1  Delhi p2012   92 
2  Delhi p2013   93 
3  Delhi p2014   95 
4 Chandigarh p2012   94 
5 Chandigarh p2013   94 
6 Chandigarh p2014   96 
7  Bihar p2012   95 
8  Bihar p2013   97 
9  Bihar p2014   98 
10  Assam p2012   96 
11  Assam p2013   97 
12  Assam p2014   97 
13  Goa p2012   99 
14  Goa p2013  100 
15  Goa p2014  100 

希望這有助於。當然,您可以通過稍微修改上面的代碼來創建2014年的數據框。

+1

紙條給OP,'tidyr :: gather'是類似於'reshape2 :: melt' – SymbolixAU

+0

意識到。我喜歡'dplyr'和'tidyr'的組合,因爲您可以將它們集成到同一個管道中。 :) – Gopala

+0

是的我 - 這是多爲原來的海報誰可能不熟悉它,因爲他們最初使用'reshape2' – SymbolixAU

2

如果您的目標是在ggplot中訂購座標軸,您可以按照原樣使用df

你只需要使用「重排」的ggplot

df<-data.frame("State" = c('Assam','Bihar','Chandigarh','Delhi','Goa'), 
          "2012" = c(96, 95, 94, 92, 99), 
          "2013" = c(97, 97, 94, 93, 100), 
          "2014" = c(97, 98, 96, 95, 100)) 

library(ggplot2) 

ggplot(data=df, aes(x=reorder(State, X2012), y=X2014)) + 
    geom_bar(stat="identity")