2017-02-25 81 views
1

我想這可能是一個相當簡單的問題,但如何做到這一點(基礎R):如何dplyr過濾器匹配?

df <- data.frame(x=10:1,y=(1:10)^2) 
df[match(c(3,5,7), df$x),] 
中慣用的dplyr說法

tb <- dplyr::as.tbl(df) 
dplyr::filter(tb, ???) 

,或者換句話說,又該何去何從到???以使其功能等同於第一個片段?請注意,結果數據幀/ Tibble中的行順序是相關的。

+0

@RichScriven:沒了,C的順序'(3,5,7) '不會保留在最終的粗暴中。 – plant

+0

然後用K代替'slice'。 'dplyr :: slice(df,match(c(3,5,7),x))' –

+0

@RichScriven:謝謝! – plant

回答

4

正如@RichScriven建議的:使用dplyr::slice(df, match(c(3, 5, 7), x))而不是dplyr::filter

1

使用filter以及:

df %>% 
    filter(x %in% c(3, 5, 7)) %>% 
    group_by(x) %>% 
    slice(1) 

輸出:

x y 
1 7 16 
2 5 36 
3 3 64 

sqldf包:

library(sqldf) 
sqldf('SELECT * 
     FROM df 
     WHERE x IN (3, 5, 7) 
     GROUP BY x 
     LIMIT 3')