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

Ash*_*Ash 4 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)
Run Code Online (Sandbox Code Playgroud)

让我们按val命令

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

完美的工作.让我们现在尝试只选择美国公司,并订购价值.我们得到了一些虚假的结果.

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

让我们订购,然后选择.再次,一个虚假的结果

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

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

Rei*_*son 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
Run Code Online (Sandbox Code Playgroud)

  • 我总是对位置匹配保持警惕,特别是在为我的工作演示代码或编写可重现的代码时,因为如果我在上面写了`subset = FOO`,我显然意味着使用`subset`而不是其他一些参数.所以你是对的,我不需要*拼出这个,但我觉得这样做比较安全,以防万一. (3认同)

had*_*ley 6

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

library(plyr)
arrange(subset(df, country == "US"), vals)
Run Code Online (Sandbox Code Playgroud)