2016-06-30 56 views
0

我认为这应该很简单,但我找不到一种方法来做到这一点。基于字符向量重新排序数据帧

我想基于一个因素重新排序数据帧。到目前为止我能找到的所有答案都提供了逻辑排序,但这是任意的,并且是数字和字母的混合。也许这是一个问题,因为它是factor而不是vector?但是,载体的答案似乎也没有效果。

任何建议将非常感激!

实例数据 (注意,这个数据仅仅是这个问题,在我真正的代码数据帧是其他一些计算的输出,所以我不能只在开始更改名称的东西明智右)

DATA<- data.frame(This=c("120", "60", "90", "OG"), That=c(453, 679,12,252)) 

DATA 

    This That 
1 120 453 
2 60 679 
3 90 12 
4 OG 252 

我想它的顺序排序,60 - 90 - 120 - OG,即

This That 
1 60 679 
2 90 12 
3 120 453 
4 OG 252 

编辑:这不是一个重复的问题。如上所述,在下面的评论中,排序是任意的。字典排序假定行名是相互关联的,在这里不是这种情况。我可以标记该行("unicorn", "18.1", "TREES", "234234235")和顺序("234234235", "unicorn", "TREES", "18.1")

+0

是否字符的顺序有关系吗?或者你想按字母顺序排序?即如果有'OG'和'AB',你想要'AB,OG'吗? – Psidom

+0

嗨@ user2100721,谢谢,但其他答案不是我所期待的。排序是任意的,而不是词典。在这种情况下,它很复杂,因为我无法更改标签。 – EcologyTom

回答

0

你可以用factor变量调整的顺序如下想让他们:

DATA$This <- factor(DATA$This, levels=c("60", "90", "120", "OG")) 

请注意,这不会改变标签值:

DATA 
    This That 
1 120 453 
2 60 679 
3 90 12 
4 OG 252 

但它改变映射到这些标签的基本整数,这样就可以对数据进行排序,你想:

DATA[order(DATA$This),] 
    This That 
2 60 679 
3 90 12 
1 120 453 
4 OG 252 
+0

谢谢@lmo,这正是我寻找的东西。我没有意识到这将是一个两步骤的过程,在第一阶段没有如我预期的那样改变它之后,我感到灰心。 – EcologyTom

0

这是一个用于排序混合类型列的选项,我们首先将列转换为数字,然后进行排序,确保数值始终位于字符值的前面,并且按照其自然顺序排序,然后按字符排序型,这使得确定的字符值是按字母顺序排列,假设Thischaracter类已经是:

library(dplyr) 
DATA %>% arrange(as.numeric(This), as.character(This)) 
# This That 
# 1 60 679 
# 2 90 12 
# 3 120 453 
# 4 OG 252 
+0

谢谢@Psidom。目前我对dplyr还是有点不确定,这就是我选择其他答案的原因。但是我可以看到它在不同的背景下会非常有帮助。 – EcologyTom