在R中对数据进行排序

5

我有一个在R中的数据框,它有900,000行和11列。列名和类型如下:

column name: date / mcode / mname / ycode / yname / yissue  / bsent   / breturn / tsent   / treturn / csales
type:        Date / Char  / Char  / Char  / Char  / Numeric / Numeric / Numeric / Numeric / Numeric / Numeric

我希望按以下顺序对数据进行排序:
  1. 日期
  2. mcode
  3. ycode
  4. yissue
这里的级别顺序很重要,即首先按日期排序,如果有相同的日期,则应按mcode排序,依此类推。我该如何在R中实现?

2
阅读help(sort)的第一段即可回答你的问题。 - Joshua Ulrich
1
在得到以下答案后,我确信我做了正确的事情。我♥ Stack Overflow。 - Mehper C. Palavuzlar
4个回答

11

也许像这样?

> df<- data.frame(a=rev(1:10), b=rep(c(2,1),5), c=rnorm(10))
> df
    a b           c
1  10 2 -0.85212079
2   9 1 -0.46199463
3   8 2 -1.52374565
4   7 1  0.28904717
5   6 2 -0.91609012
6   5 1  1.60448783
7   4 2  0.51249796
8   3 1 -1.35119089
9   2 2 -0.55497745
10  1 1 -0.05723538
> with(df, df[order(a, b, c), ])
    a b           c
10  1 1 -0.05723538
9   2 2 -0.55497745
8   3 1 -1.35119089
7   4 2  0.51249796
6   5 1  1.60448783
5   6 2 -0.91609012
4   7 1  0.28904717
3   8 2 -1.52374565
2   9 1 -0.46199463
1  10 2 -0.85212079

"order"函数可以将多个向量作为参数。


5
你也可以在排序参数前加上一个“-”来按该标准进行升序排序,而不是降序排序,例如order(df$b, -df$a, df$c)。请注意,这只会影响到该特定的排序标准,不会影响其他标准的排序方式。 - caracal

8

在之前的解决方案基础上,这里提供另外两种方法。第二种方法需要使用plyr。

df.sorted = df[do.call(order, df[names(df)]),];
df.sorted = arrange(df, a, b, c) 

4
如果以上答案都不符合您的需求,您可以使用doBy包中的orderBy()函数:http://rss.acs.unt.edu/Rdoc/library/doBy/html/orderBy.html
require(doBy)
sortedData <- orderBy(~date+mcode+ycode+yissue , data=unsortedData)

你可能会直观地想到,在任何变量前面加上负号可以将其按降序排序。

orderBy()没有什么神奇的。正如文档所述,它是"order()函数的一个包装器——重要的区别在于,可以通过模型公式给出要排序的变量。"

我认为这种语法更容易记忆。


1

附加说明:使用-c()来反向排序因子或字符列

with(df, df[order(a, b, -c(myCharCol)), ])

另外,您可以添加一个向量来选择特定的列

with(df, df[order(a, b, c), c('a','b','x','y')])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接