【问题标题】:Sorting data in R在 R 中对数据进行排序
【发布时间】:2010-11-03 14:21:36
【问题描述】:

我在R中有一个90万行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 中做到这一点?

【问题讨论】:

  • 阅读help(sort)的第一段回答你的问题。
  • 得到以下答案后,我确信我做对了。我 ♥ 堆栈溢出。

标签: r sorting dataframe


【解决方案1】:

也许是这样的?

> 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”函数可以将多个向量作为参数。

【讨论】:

  • 您也可以在 order 的参数前加上 - 以升序而不是降序排序,例如 order(df$b, -df$a, df$c)。跨度>
【解决方案2】:

在早期解决方案的基础上,这里有另外两种方法。第二种方法需要 plyr。

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

【讨论】:

    【解决方案3】:

    如果以上答案都不能点燃你的热情,你可以随时使用 doBy 包中的 orderBy() 函数:

    require(doBy)
    sortedData <- orderBy(~date+mcode+ycode+yissue , data=unsortedData)
    

    正如您可能直观地预期的那样,您可以在任何变量前面放置一个负号来对其进行降序排序。

    orderBy() 没有什么神奇之处。正如文档所述,它是“ order() 函数的包装器 - 重要的区别在于排序变量可以由模型公式给出。”

    我发现语法更容易记住。

    【讨论】:

      【解决方案4】:

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

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

      你也可以添加一个向量来只选择某些列

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-16
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        • 2020-06-19
        • 1970-01-01
        相关资源
        最近更新 更多