2014-10-09 58 views
1

已經多次聲明dplyr會丟棄rownames,現在版本0.3已經這樣做了。如何在使用dplyr時根據行名替換lookup

我經常用行名稱不同的標識符之間轉換保持在這樣的數據幀:

test <- data.frame(Greek = c("Alpha", "Beta", "Gamma"), Letters = LETTERS[1:3]) 
rownames(test) <-test$Letters 
lookup <- c("C", "B") 
test[lookup, "Greek"] 
[1] Gamma Beta 
Levels: Alpha Beta Gamma 

由於缺乏rownames這個現在失敗dplyr

library(dplyr) 
test <- tbl_df(data.frame(Greek = c("Alpha", "Beta", "Gamma"), Letters = LETTERS[1:3])) 
rownames(test) <-test$Letters 
lookup <- c("C", "B") 
test[lookup, "Greek"] 
Source: local data frame [2 x 1] 

Greek 
1 NA 
2 NA 

我我嘗試過使用filter()和select(),但找不到解決方案,它保留了查找的順序。

回答

2

,這一次,您可以與match ES玩:

test[match(lookup,test$Letters),"Greek"] 
[1] Gamma Beta 
Levels: Alpha Beta Gamma 

而且你可以在do包裹,使其dplyr-IC:

test %>% do(`[`(.,match(lookup,.$Letters),)) %>% select(Greek) 
Source: local data frame [2 x 1] 

    Greek 
1 Gamma 
2 Beta 

或者作爲@hadley提到, left_join不在做什麼您尋找:

left_join(data.frame(Letters=lookup),test) %>% select(Greek) 
Joining by: "Letters" 
    Greek 
1 Gamma 
2 Beta 
+1

dplyr-ic版本並不是我稱之爲漂亮的代碼,但兩個版本似乎都很好。謝謝! – user2464290 2014-10-09 15:03:34

+1

或者更好,使用'left_join()'或'inner_join()' – hadley 2014-10-09 22:02:39

+1

@hadley'inner_join'似乎重新排序,但是'left_join'完成了OP所需的操作。 – James 2014-10-10 10:22:40