2011-12-08 1326 views
3

原谅我的无知,但我在排序数据框时遇到了问题。我想在排序时指定一个有序列表,如c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"),以便数据框按列表顺序排序。如何使用R中的列表指定排序顺序?

在这个例子中,我想先从

Day Present Count 
    Fri No 164 
    Fri Yes 131 
    Mon No 142 
    Mon Yes 174 
    Sat No 39 
    Sat Yes 26 
    Sun No 44 
    Sun Yes 39 
    Thu No 191 
    Thu Yes 192 
    Tue No 184 
    Tue Yes 214 
    Wed No 343 
    Wed Yes 255 

,并结束与

Day Present Count 
    Mon No 142 
    Mon Yes 174 
    Tue No 184 
    Tue Yes 214 
    Wed No 343 
    Wed Yes 255 
    Thu No 191 
    Thu Yes 192 
    Fri No 164 
    Fri Yes 131 
    Sat No 39 
    Sat Yes 26 
    Sun No 44 
    Sun Yes 39 

我已经试过perday[do.call(order, perday[c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")]),]但我得到“选择未定义列”。如果字符向量中有14个条目,我也会得到相同的错误,所以我现在非常困惑。

这里的dput:

perday<-structure(list(dayofweek = c("Fri", "Fri", "Mon", "Mon", "Sat", 
"Sat", "Sun", "Sun", "Thu", "Thu", "Tue", "Tue", "Wed", "Wed" 
), Attended = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L), .Label = c("No", "Yes"), class = "factor"), 
    nrow = c(164L, 131L, 142L, 174L, 39L, 26L, 44L, 39L, 191L, 
    192L, 184L, 214L, 343L, 255L)), .Names = c("dayofweek", "Attended", 
"nrow"), row.names = c(NA, -14L), class = "data.frame") 

回答

8

您可以

perday[order(factor(perday$dayofweek,levels=c(c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")))),] 

这给

dayofweek Attended nrow 
3  Mon  No 142 
4  Mon  Yes 174 
11  Tue  No 184 
12  Tue  Yes 214 
13  Wed  No 343 
14  Wed  Yes 255 
9  Thu  No 191 
10  Thu  Yes 192 
1  Fri  No 164 
2  Fri  Yes 131 
5  Sat  No 39 
6  Sat  Yes 26 
7  Sun  No 44 
8  Sun  Yes 39 
+2

啊,必须让他们的因素,然后指定的水平。现在我已经开始在我的导入中设置stringsAsFactors = FALSE,我真的开始学习什么因素了! –

+0

太好了。这使生活变得轻松。 – saudic

0

说不上为什么这样做 “内联”,但并没有改变的顺序我的数据帧。

相反,下面的代码所做的:

dfordered=df[c(1,2,3,9,5,6,8,10,11,4,7),] 

注意,你只需要改变你的DF行的原始顺序。

相关问题