2011-02-01 14 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)