选择行并在R中对结果进行排序

时间:2011-02-01 14:20:38

标签: sorting r dataframe

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

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排序?

3 个答案:

答案 0 :(得分:6)

不确定是否可以通过对[的一组子集调用来执行此操作,因为您需要在第二个子集调用中引用有序或缩减的数据帧。一种方法是订购数据并将其提供给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 :(得分:6)

我总觉得奇怪的是,基数R没有方便重新排序数据帧,就像它进行子集化一样。所以我写了自己的:

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

答案 2 :(得分: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)。