2016-08-04 30 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实际上可以处理逻辑运算符,所以你不需要砍掉子集表达式。我已经编辑了相应的答案。 –