2012-02-22 53 views
6

手动数据帧i具有以下的数据帧排序使用非数字列

dd <- data.frame(b = c("High", "Medium", "Highest", "Low", "Not bad","Good", "V. Good"), 
    x = c("C3", "C1", "C4", "N2", "C2", "N1","N4"), x = c("5", "2", "3", "6", "7", "5","7")) 

,所以我想数据帧使用手动为了使变量X

例如被转化:这是原来的一个

1 High C3 5 
2 Medium C1 2 
3 Highest C4 3 
4  Low N2 6 
5 Not bad C2 7 
6 Good N1 5 
7 V. Good N4 7 

,但我想要的是一个新的数据帧中基于X的值开始,但不是按字母顺序,但我选择了如订单随机:

the first row has x=C1, the second have x=C2, the third have x=N4, ...etc 

这怎么办?

谢谢

+0

你的data.frame真的只有7行吗?如果是这样,为什么不首先按照正确的顺序创建它?或者,为了重新排序,可以使用'dd [c(2,5,7等)]],其中2,5,7等等是你想要的顺序的行号。 – jbaums 2012-02-22 09:15:58

+1

@jbaums:不,它不是,但这是其中的一部分,剩下的部分与X变量相同,但其他变量不同。所以我想根据它们的X值将它应用于所有数据框 – ifreak 2012-02-22 09:52:51

回答

10

由于x列是一个因素, 你可以简单地确保它的级别按你想要的顺序。

# New sorting order 
desired_order <- sample(levels(dd$x)) 
# Re-order the levels 
dd$x <- factor(as.character(dd$x), levels=desired_order) 
# Re-order the data.frame 
dd <- dd[order(dd$x),] 
+0

我没有得到如何分配我想要的顺序? ? – ifreak 2012-02-22 11:23:30

+0

您应该在'desired_order'变量 (无重复)中指定所需的顺序。在这个例子中,我只是使用了一个随机的顺序,但是你可以用手指定它,例如,012_C1_0,C2_4, “,”C3“)'。 – 2012-02-22 12:19:39

+0

,但是这将适用于整个数据帧(包括同一类型的子数据帧)? – ifreak 2012-02-22 13:38:03

0

如果您data.frame还真是够小的手动重新排序,那么就使数1:7的载体,在该行应该出现的方式订购。例如:

dd[c(2,5,7,1,4,3,6),] 

    b x x.1 
    2 Medium C1 2 
    5 Not bad C2 7 
    7 V. Good N4 7 
    1 High C3 5 
    4  Low N2 6 
    3 Highest C4 3 
    6 Good N1 5 

或者,如果你真的想用一个特征向量来做到这一点,你也可以通过行名字引用,像这样:

rownames(dd) <- as.character(dd$x) 
    dd[c("C1","C2","N4","C3","N2","C4","N1"),] 

    b x x.1 
    C1 Medium C1 2 
    C2 Not bad C2 7 
    N4 V. Good N4 7 
    C3 High C3 5 
    N2  Low N2 6 
    C4 Highest C4 3 
    N1 Good N1 5 
+0

它不是那么小,但这是它的一部分,剩下的部分与X变量相同,但其他变量是不同的值。所以我想基于它们的X值应用于所有的数据框架(但也我认为每个数据框架作为一个小数据框架,并将此顺序应用于它) – ifreak 2012-02-22 09:58:22