2016-02-26 40 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")