【问题标题】:Selecting rows and ordering the result in R在 R 中选择行并对结果进行排序
【发布时间】:2011-06-19 07:37:13
【问题描述】:

在数据框中选择行然后对其进行排序这一看似微不足道的任务让我难以理解,同时也让我发疯。例如,让我们有一个简单的数据框:

country = c("US", "US", "CA", "US")
company = c("Apple", "Google", "RIM", "MS")
vals = c(100, 70, 50, 90)
df <- data.frame(country, company, vals)

让我们按 vals 排序

> df[order(vals),]
  country company vals
3      CA     RIM   50
2      US  Google   70
4      US      MS   90
1      US   Apple  100

完美运行。现在让我们尝试只选择美国公司,并在那​​里订购价值。我们得到了一些虚假的结果。

> df[country=="US", ][order(vals),]
    country company vals
4       US      MS   90
2       US  Google   70
NA    <NA>    <NA>   NA
1       US   Apple  100

让我们订购,然后选择。又是一个虚假的结果

> df[order(vals),][country=="US", ]
  country company vals
3      CA     RIM   50
2      US  Google   70
1      US   Apple  100

如何获取数据框,仅包含美国公司,并按 val 排序?

【问题讨论】:

  • 在开始执行此操作之前删除用于创建df 的变量,因为这些变量将被发现而不是df 中的变量。这并不能解决问题,但会有所帮助......

标签: sorting r dataframe


【解决方案1】:
> df[df$country=="US",][order(df[df$country=="US","vals"]),]
  country company vals
2      US  Google   70
4      US      MS   90
1      US   Apple  100

我认为删除原始变量并仅使用数据框是一个好习惯(因此使用 df$country 而不是国家/地区)。

【讨论】:

  • 这行得通,但实际上你是在做两次country=="US" 子集。分开执行这两个步骤会更容易,特别是如果country=="US" 的计算成本在真实数据上很高,例如:tmp &lt;- df[order(df$vals), ] 后跟tmp[tmp$country == "US",]。如果重新排序步骤无害,则将 tmp 替换为 df
  • 我同意,我首先写了你的确切的两行。出于某种原因,尽管我决定合并这些步骤。我更喜欢你的解决方案。
【解决方案2】:

不确定您是否可以通过对[ 的一组子集调用来执行此操作,因为您需要在第二个子集调用时引用有序或缩减的数据框。一种方法是对数据进行排序并将其提供给subset() 以从此有序数据框中选择行:

> with(df, subset(df[order(vals),], subset = country == "US"))
  country company vals
2      US  Google   70
4      US      MS   90
1      US   Apple  100

【讨论】:

  • +1 我总是更喜欢子集方法。稍微简化一下——你不需要在subset() 调用中说subset =
  • 我总是对位置匹配保持警惕,尤其是在演示代码或为我的工作编写可重现的代码时,因为如果我在上面写subset = FOO,我显然是打算使用subset而不是其他的论点。所以你是对的,我不需要把它拼出来,但我发现这样做更安全,以防万一。
【解决方案3】:

我总是觉得奇怪的是,基本 R 没有像子集那样方便地重新排序数据框。所以我自己写了:

library(plyr)
arrange(subset(df, country == "US"), vals)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多