如何在对数据帧进行子集化时将字符串用作对象和子集

时间:2016-08-04 19:22:53

标签: r

我有一个数据框,我想使用用户输入进行子集化。用户将提交具有三个字段的文件:数据帧到子集,子集条件和要选择的列。 file.txt中的示例行将是:

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

将使用数据框mtcars,将mpg > 21hp > 100的所有内容子集,并选择所有列。

您可以使用

阅读此内容
query <- read.csv("file.txt", header=F, stringsAsFactors=F)

然后使用

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

这不起作用,因为它不会将query$V2识别为逻辑语句,并且它不会检测as.name(query$V1)的列。这样的事情可能吗?有一个更好的方法吗?我需要能够通过文件输入对用户运行多个子集/查询。

1 个答案:

答案 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