2016-08-04 59 views
-1

我有一個數據框我想使用用戶輸入的子集。用戶將提交包含三個字段的文件:數據框到子集,子集條件和要選擇的列。在file.txt一個例子線將是:如何使用字符串作爲對象和子集數據框時子集

"mtcars","mpg > 21 & hp > 100","" 

會用數據幀mtcars,子集中的所有那些具有mpg > 21hp > 100,並選擇所有的列。

您可以用

query <- read.csv("file.txt", header=F, stringsAsFactors=F) 

閱讀中,然後用

subset(as.name(query$V1), query$V2) 

運行subset,因爲它不承認query$V2作爲一個邏輯語句這不工作,沒有檢測as.name(query$V1)的列。這樣的事情可能嗎?有一個更好的方法嗎?我需要能夠通過文件輸入對用戶運行多個子集/查詢。

+1

很難確切知道你例如,但這應該在簡單的'mtcars'之一中工作:''eval(parse(text =「subset(mtcars,mpg> 21&hp> 100)」))' –

+0

'mtcars'是一個內置的數據集,這似乎工作 – TomNash

回答

0

的dplyr功能標準評估版本允許你這樣做,而不是允許由EVAL允許同種任意代碼執行(解析(文本=))

library(dplyr) 

# Read user input 
user_input <- data_frame("mtcars","mpg > 21 & hp > 100", "cyl, mpg, hp") %>% 
    as.list() 

# Find user specified data.frame 
out <- get(user_input[[1]]) 

# Filter data by user input 
if (user_input[[2]] != '') { 
    out <- out %>% 
    filter_(.dots = user_input[[2]]) 
} 

# Select user specified cols 
if (user_input[[3]] != '') { 
    # assuming the col names are comma separated 
    user_input[[3]] <- unlist(strsplit(user_input[[3]], ',')) 
    out <- out %>% 
    select_(.dots = user_input[[3]]) 
} 

out 
+0

我也喜歡這樣的想法和想法,但有多個運營商可以劃分條款,有些可以分組。將整個子集字符串作爲一個字符最好不要切斷已經正確格式化的輸入。當然,我需要檢查你的case中的user_input [[2]]是否被正確格式化了。 – TomNash

+0

filter實際上可以處理邏輯運算符,所以你不需要砍掉子集表達式。我已經編輯了相應的答案。 –