2015-02-04 7 views
5

मैं कैसे एक समारोह सवाल here के समान में एक स्तंभ नाम पारित कर सकते हैं में dplyr :: फिल्टर() और% का उपयोग कर, लेकिन एक साथ dplyr श्रृंखलन और filter() का उपयोग कर %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)) 

हैं जहां स्तंभ एक 1 या 2 मैं क्या कर सकता है पंक्तियों प्राप्त करना चाहते हैं:

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

मैं:

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

अब, मैं कैसे एक समारोह में इस डाल सकते हैं , जहां कोई कॉलम निर्दिष्ट कर सकता है, यह काम नहीं करता है:

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

उत्तर

8

आप

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

या

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

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

करने के लिए अपने समारोह बदलने का प्रयास करें यह कुछ के लिए अच्छा है अब देखो। जब मैंने कुछ समय पहले इसी तरह के सवाल पूछा, तो @ ओस्मिथ ने एक अच्छा जवाब दिया। यहां, मुझे एक अद्यतन संस्करण दिखाई देता है। आज मैं नोट्स ले रहा हूं। :) +1 – jazzurro

+0

@jazzurro टिप्पणी के लिए धन्यवाद। – akrun

+0

@akrun क्या आप अपने विकल्प 2 के लिए स्पष्टीकरण डाल सकते हैं - 'match.call()' में फ़ंक्शन के अंदर रखे गए सभी तर्क शामिल होंगे? और यह 'eval()' में 'फ़िल्टर()' द्वारा व्याख्यात्मक कैसे हो सकता है? – user3375672

4

आप अपने समारोह रखना चाहते हैं की कोशिश कर सकते, कोशिश:

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

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

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