2015-02-04 20 views
5

Come posso passare il nome di una colonna in una funzione simile alla domanda here ma utilizzando la concatenazione dplyr e filter() insieme a %in%.R, passare il nome della colonna come argomento per funzionare utilizzando dplyr :: filter() e% in%

require(dplyr) 
set.seed(8) 
df <- data.frame(
    A=sample(c(1:3), 10, replace=T), 
    B=sample(c(1:3), 10, replace=T)) 

Se vuole ottenere righe in cui la colonna A è 1 o 2 che posso fare:

df %>% filter(A %in% c(1,2)) 

ottengo:

A B 
1 2 3 
2 1 2 
3 1 3 
4 2 1 
5 1 1 
6 1 3 

Ora, come posso mettere questo in una funzione , dove è possibile specificare la colonna, questo non funziona:

fun1 <- function(x, column, n){ 
    res <- 
    x %>% filter(column %in% n) 
    return(res) 
} 
fun1(df, A, c(1,2)) 

risposta

8

Si potrebbe provare

fun1 <- function(x, column, n){ 
x %>% 
    filter_(lazyeval::interp(quote(x %in% y), x=as.name(column), y=n)) 
} 
fun1(df, 'A', 1:2) 

O

fun2 <- function(x, column, n){ 
    args <- as.list(match.call()) 
    x %>% 
    filter(eval(args$column, x) %in% n) 
} 

fun2(df, A, 1:2) 
+0

Questo è qualcosa di buono da vedi ora Quando ho fatto una domanda simile qualche tempo fa, @aosmith ha fornito una bella risposta. Qui, vedo una versione aggiornata. Oggi sto prendendo appunti. :) +1 – jazzurro

+0

@jazzurro Grazie per il commento. – akrun

+0

@akrun potresti inserire una spiegazione per la tua opzione 2 - will 'match.call()' contiene tutti gli argomenti che sono inseriti nella funzione? E come questo può essere interpretato da 'filter()' in 'eval()'? – user3375672

4

Se si desidera mantenere la vostra funzione, provare:

fun1 <- function(x, column, n){ 
    res <- x %>% filter_(paste(column,"%in%",n)) 
    return(res) 
} 

fun1(df, "A", "c(1,2)") 
2

provare a cambiare la vostra funzione di

fun1 <- function(x, column, n){ 
    require(lazyeval) 
    filter_(x, 
     interp(quote(col %in% n), 
      col = lazy(column), n = n)) 
} 

all(fun1(df, A, c(1, 2)) == filter(df, A %in% c(1,2))) 
# TRUE 
Problemi correlati