在数据框中选择行然后对它们进行排序这一看似微不足道的任务正在躲避我,同时让我发疯。例如,让我们有一个简单的数据框:
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排序?
答案 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)。