R:按第一列排序和排列数据

时间:2014-02-12 12:04:11

标签: r excel sorting

我的数据格式如下:

tot          zona a         zonab            zona c
anna        francesco     anna           barbara 
antonio     giancarlo   antonio     elena 
barbara     giuseppe    barbara     francesco 
elena       roberto     giuseppe    giancarlo 
francesco   silvia          roberto     gianluca 
giancarlo   sussanna    silvia           giovanna 
gianluca    valentina   valentina   giuseppe
giovanna            roberto 
giuseppe            silvia 
roberto             
silvia          
sussanna            
valentina   

我想要做的是根据第一列订购它们,例如输出将是这样的(其中每列按照tot的顺序排列,并且缺少值有一个空格 - NA会很好以及):

tot        zona a           zonab          zona c
anna     anna           barbara 
antonio                 antonio     
barbara                 barbara 
elena                          elena
francesco   francesco              francesco
giancarlo   giancarlo              giancarlo 
gianluca                    gianluca 
giovanna             giovanna 
giuseppe    giuseppe    giuseppe
roberto     roberto     roberto     roberto 
silvia   silvia             silvia          silvia 
sussanna    sussanna    valentina   
valentina   valentina   

我在R中试过这个:

newdat <- spe[order(row.names(spe)),]

Spe <- arrange(SPE, Total)

SPE_NEW <- data[order(spe$row.names),]

这只是我有大量数据的子集,有没有办法对我的数据进行排序?谁能给我一些建议?

1 个答案:

答案 0 :(得分:1)

假设我们从这样的事情开始:

mydf
#          tot     zonaa     zonab     zonac
# 1       anna francesco      anna   barbara
# 2    antonio giancarlo   antonio     elena
# 3    barbara  giuseppe   barbara francesco
# 4      elena   roberto  giuseppe giancarlo
# 5  francesco    silvia   roberto  gianluca
# 6  giancarlo  sussanna    silvia  giovanna
# 7   gianluca valentina valentina  giuseppe
# 8   giovanna   roberto                    
# 9   giuseppe    silvia                    
# 10   roberto                              
# 11    silvia                              
# 12  sussanna                              
# 13 valentina                              

您可以尝试使用match

within(mydf, {
  zonaa <- zonaa[match(tot, zonaa)]
  zonab <- zonab[match(tot, zonab)]
  zonac <- zonac[match(tot, zonac)]
})
#          tot     zonaa     zonab     zonac
# 1       anna      <NA>      anna      <NA>
# 2    antonio      <NA>   antonio      <NA>
# 3    barbara      <NA>   barbara   barbara
# 4      elena      <NA>      <NA>     elena
# 5  francesco francesco      <NA> francesco
# 6  giancarlo giancarlo      <NA> giancarlo
# 7   gianluca      <NA>      <NA>  gianluca
# 8   giovanna      <NA>      <NA>  giovanna
# 9   giuseppe  giuseppe  giuseppe  giuseppe
# 10   roberto   roberto   roberto      <NA>
# 11    silvia    silvia    silvia      <NA>
# 12  sussanna  sussanna      <NA>      <NA>
# 13 valentina valentina valentina      <NA>

这是相同的想法,更简洁地实施。

mydf2 <- mydf ## Work on a copy instead of overwriting your data
mydf2[-1] <- lapply(mydf2[-1], function(x) x[match(mydf2[[1]], x)])
mydf2

这里有一些可重复格式的数据:

mydf <- structure(list(tot = c("anna", "antonio", "barbara", "elena", 
    "francesco", "giancarlo", "gianluca", "giovanna", "giuseppe", 
    "roberto", "silvia", "sussanna", "valentina"), zonaa = c("francesco", 
    "giancarlo", "giuseppe", "roberto", "silvia", "sussanna", "valentina", 
    "roberto", "silvia", "", "", "", ""), zonab = c("anna", "antonio", 
    "barbara", "giuseppe", "roberto", "silvia", "valentina", "", 
    "", "", "", "", ""), zonac = c("barbara", "elena", "francesco", 
    "giancarlo", "gianluca", "giovanna", "giuseppe", "", "", "", 
    "", "", "")), .Names = c("tot", "zonaa", "zonab", "zonac"),
    class = "data.frame", row.names = c(NA, -13L))