2011-02-01 17 views
4

在数据帧选择行的看似琐碎的任务,然后命令他们在躲避我,快把我逼疯了在同一时间。例如,让我们有一个简单的数据帧:选择行和排序结果中的R

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

删除用于创建`df`的变量,然后再开始执行此操作,因为这些变量不会在`df`中找到。这并没有解决问题,反而会帮助... – 2011-02-01 14:35:34

+1

http://www.ats.ucla.edu/stat/r/faq/sort.htm – 2011-02-01 14:37:22

回答

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
> 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 $国家,而不是国家)。

+0

这样的作品,但你是,实际上,做了` country ==“US”`子集两次。分开执行这两个步骤会更容易,特别是如果“country ==”US“`的计算成本在实际数据上较高,例如:`tmp < - df [order(df $ vals)]`接着是`tmp [tmp $ country ==“US”,]`。如果重新排序步骤无害,请将`tmp`替换为`df`。 – 2011-02-01 14:44:19

6

我一直觉得奇怪的是,基础R没有为重新排序像一个数据帧便利它适用于子集。所以我写了我自己的:

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