排序数据
问题描述:
我有900000行和R. 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
欲按以下顺序通过这些变量的数据进行排序:
- 日期
- 的MCode
- ycode
- yissue
这里级别的顺序很重要,即它们应该先按日期排序,如果有相同的日期,它们应该按mcode排序,等等。我如何在R中做到这一点?
答
也许像这样?
> 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
“顺序”功能可以采取若干向量作为参数。
答
基于早期的解决方案,这里有两种其他方法。第二种方法需要plyr。
df.sorted = df[do.call(order, df[names(df)]),];
df.sorted = arrange(df, a, b, c)
答
如果上述答案的照亮你的火,你可以随时使用orderBy()函数从doBy包:
require(doBy)
sortedData <- orderBy(~date+mcode+ycode+yissue , data=unsortedData)
正如你可能直观地想到,可以把负号前面任何变量将其降序排序。
orderBy()没有什么神奇的。正如文档所述,它是一个“order()函数的包装器 - 重要的区别是可以通过模型公式给出要排序的变量。”
我发现语法更容易记住。
答
其他注意事项:使用-c()逆转排序因子或字符列
with(df, df[order(a, b, -c(myCharCol)), ])
你也可以添加一个载体,只挑某些列
with(df, df[order(a, b, c), c('a','b','x','y')])
读的'帮助第一段(排序)'回答你的问题。 – 2010-11-03 15:49:43
得到下面的答案后,我确信我做了正确的事情。我♥堆栈溢出。 – 2010-11-03 19:12:37