2014-06-25 18 views
0

我編寫的函數將允許某人將3個數據集傳入函數,然後基於大於/小於/等於數據集中的一個變量對合並的數據集進行子集合。因此,像:如何在R中創建用戶輸入的小於或大於(或等於)變量?

myfunc <- function(data1, data2, data3, subsetvariable, gle, criterion){ 
.... 
.... 
} 

其中data1,2,3是數據集,subsetvariable是像年齡或體重,而標準是一樣的東西20年來,145斤等變量GLE大於/小於大於/等於用戶應該能夠進入該功能。

的功能,我會碰到這樣的內部:

data <- data[data$age > 30,] 

這將是很容易簡單地把在年齡subsetvariable和30標準變量到位,但如何通過「>」進入功能?

感謝您的幫助!

+0

你如何合併數據集? – James

+0

通過使用合併功能。但是,最後的子變量將來自原始data1數據集。 – user2395969

+0

我有一種感覺,data.table或dplyr會提供更優雅的解決方案,但是您可以使用反引號傳遞比較運算符函數,然後使用data [gle(data [[subsetvariable]],criterion ),]'。否則,你可以作爲字符串傳遞並使用'match.fun'或'switch' – James

回答

2

您可以通過「<」作爲角色。只需使用?match.fun即可調用正確的功能。

fct <- function(a, b, gle){ 
    gle <- match.fun(gle) 
    gle(a, b) 
} 
identical(fct(1, 0:3, "<"), 1<0:3) 
identical(fct(1, 0:3, ">="), 1>=0:3) 
0

儘管您可以使用非標準評估來直接插入角色到評估中,但最簡單的方法可能是使用條件語句。

說大於/小於/等於的用戶輸入稱爲eq_sym。剛做這樣的事情:

test <- switch(eq_sym, '>' = data$age > 30, '<' = dat$age < 30, '=' = data$age == 30, NA) 
if (is.na(test)) { 
    stop("must be >, <, or =") 
} else { 
    data <- data[test,] 
} 
1

你可以有用戶2個字母代表大於,小於或等於像一些語言使用,如果else語句使用。

GT =大於

GE =大於或等於

當量=等於

LT =小於

LE =小於或等於

0

這裏是一個版本,允許您以與subset相同的方式傳遞完整表達式。無需挑剔與柱,功能,並單獨的值:

df1 <- data.frame(a=letters, b=1:26) 
df2 <- data.frame(a=letters, c=LETTERS, age=21:46) 

myfunc(df1, df2, age > 43) 

這將返回兩個數據幀合併,子集由表達式age > 43

a b c age 
24 x 24 X 44 
25 y 25 Y 45 
26 z 26 Z 46 

這裏是源:

myfunc <- function(data1, data2, subsetcommand) { 
    data <- merge(data1, data2) 
    sub.call <- bquote(subset(data, .(substitute(subsetcommand)))) 
    eval(sub.call) 
} 

關鍵是要建立在我們合併後的數據集的subset調用,然後substitute用戶提供的命令第二個參數調用subset。這就是bquote所做的業務。 bquote需要一個命令,並引用它,以便它不被R評估,而是存儲爲解析命令。關於bquote的特殊部分是它評估.()中的部分,因此substitute可以完成其工作。

一旦我們的子表達式被用戶表達式取代,我們就可以對它進行評估。