【问题标题】:How to sort and filter data.frame in R?如何在 R 中对 data.frame 进行排序和过滤?
【发布时间】:2012-04-01 14:59:00
【问题描述】:

我了解如何对数据框进行排序:

df[order(df$Height),]

我了解如何过滤(或子集)匹配某个谓词的数据框:

df[df$Weight > 120,]

但是我如何对 过滤器进行排序(例如,按高度排序并按重量过滤)?

【问题讨论】:

    标签: r sorting dataframe subset


    【解决方案1】:
    df1 <- df[order(df$height), ][df$weight > 120, ]
    

    只需确保将订单放在过滤器之前。

    【讨论】:

      【解决方案2】:

      data.table 包允许您在一行短代码中完成此操作:

      借用 Dirk Eddelbuettel 的例子,设置一些数据:

      set.seed(42)
      df <- data.frame(weight=rnorm(10, 120, 10), height=rnorm(10, 160, 20))
      

      data.frame 转换为data.table 和重量子集,按高度排序:

      library(data.table)
      dt <- data.table(df)
      
      dt[weight>120][order(height)]
      
             weight   height
      [1,] 140.1842 111.1907
      [2,] 123.6313 132.2228
      [3,] 135.1152 154.3149
      [4,] 126.3286 154.4242
      [5,] 124.0427 157.3336
      [6,] 133.7096 186.0974
      

      【讨论】:

      • 不错。是的,这是data.table 的主要便利功能之一。我想知道新用户是否认为他们必须一直转换才能使用data.table?在这种情况下,以及许多其他情况下,对data.frame() 的调用可以替换为data.table(),并且首先以data.table 开头时无需转换。我知道你知道这一点,这真的只是一个营销问题。
      【解决方案3】:

      分两步

       df1 <- df[df$weight > 120, ]
       df2 <- df1[order(df1$height), ]
      

      或者如果你必须一步一步来——但它确实不是更干净。

      数据优先:

      R> set.seed(42)
      R> df <- data.frame(weight=rnorm(10, 120, 10), height=rnorm(10, 160, 20))
      R> df
         weight height
      1   133.7  186.1
      2   114.4  205.7
      3   123.6  132.2
      4   126.3  154.4
      5   124.0  157.3
      6   118.9  172.7
      7   135.1  154.3
      8   119.1  106.9
      9   140.2  111.2
      10  119.4  186.4
      

      一种方法是双子集化:

      R> subset(df, weight > 120)[order(subset(df, weight > 120)$height),]
        weight height
      9  140.2  111.2
      3  123.6  132.2
      7  135.1  154.3
      4  126.3  154.4
      5  124.0  157.3
      1  133.7  186.1
      R> 
      

      我会分两步走。

      【讨论】:

      • 只是出于好奇,为什么set.seed(42)
      • 我会使用reshape2::arrange(subset(df, weight &gt; 120), height)
      • 我在等待合适的哈德利主义 :-)
      • @DirkEddelbuettel @mrdwab 我当然知道。我会说为什么是42,而不是12
      • 这是对“银河系漫游”的温和文化参考。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多