我有一个数据框,我想使用用户输入进行子集化。用户将提交具有三个字段的文件:数据帧到子集,子集条件和要选择的列。 file.txt
中的示例行将是:
"mtcars","mpg > 21 & hp > 100",""
将使用数据框mtcars
,将mpg > 21
和hp > 100
的所有内容子集,并选择所有列。
您可以使用
阅读此内容query <- read.csv("file.txt", header=F, stringsAsFactors=F)
然后使用
运行subset
subset(as.name(query$V1), query$V2)
这不起作用,因为它不会将query$V2
识别为逻辑语句,并且它不会检测as.name(query$V1)
的列。这样的事情可能吗?有一个更好的方法吗?我需要能够通过文件输入对用户运行多个子集/查询。
答案 0 :(得分:0)
dplyr函数的标准评估版本允许您执行此操作,同时不允许eval允许的相同类型的任意代码执行(parse(text =))
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