Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用存储在字符变量中的逻辑运算符在R中对数据帧进行子集设置_R_Logical Operators - Fatal编程技术网

使用存储在字符变量中的逻辑运算符在R中对数据帧进行子集设置

使用存储在字符变量中的逻辑运算符在R中对数据帧进行子集设置,r,logical-operators,R,Logical Operators,我的R脚本从用户那里获得三个输入,它们被读入var1、var2和var3 我正在尝试对数据帧执行一个简单的子集操作。我思维的伪代码是 如下所示: subset_data_frame<- dat[ dat[[var1]] var2 var3 , ] where var1= column name from dat var2= can be any of the logical operator like '==', '>', '<' etc.

我的R脚本从用户那里获得三个输入,它们被读入var1、var2和var3

我正在尝试对数据帧执行一个简单的子集操作。我思维的伪代码是 如下所示:

subset_data_frame<- dat[ dat[[var1]] var2 var3 , ]

where     var1= column name from dat
          var2= can be any of the logical operator like '==', '>', '<' etc.
          var3= numeric value    
subset\u data\u frame(1)正则表达式

首先需要根据用户的输入构造一个合法表达式,然后将该字符串作为命令进行计算。这是一个POC

> cmd <- "iris[iris$1% 2% 3%,]"
> columnname <- readline("columnname:")
columnname:Sepal.Length
> operator <- readline("operator:")
operator:<
> value <- readline("value:")
value:5
> cmd <- gsub("1%", columnname, cmd)
> cmd <- gsub("2%", operator, cmd)
> cmd <- gsub("3%", value, cmd)
> cmd
[1] "iris[iris$Sepal.Length < 5,]"
> eval(parse(text=cmd))
Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa
7            4.6         3.4          1.4         0.3     setosa
9            4.4         2.9          1.4         0.2     setosa
10           4.9         3.1          1.5         0.1     setosa
12           4.8         3.4          1.6         0.2     setosa
13           4.8         3.0          1.4         0.1     setosa
...
>cmd columnname运算符值cmd
[1] 鸢尾[鸢尾$萼片.长度<5,]
>eval(解析(text=cmd))
萼片。长萼片。宽花瓣。长花瓣。宽种
2 4.9 3.0 1.4 0.2刚毛
3 4.7 3.2 1.3 0.2刚毛
4.6 3.1 1.5 0.2刚毛
7.4.6 3.4 1.4 0.3刚毛
9.4.2.9 1.4 0.2刚毛
10 4.9 3.1 1.5 0.1刚毛
12 4.8 3.4 1.6 0.2刚毛
13 4.8 3.0 1.4 0.1刚毛
...
(2) 元程序


这是一章——哈雷威克姆的高级R中的表达式。在这一章中,他解释了如何编写“程序”的细节

如果用户以字符形式输入这些变量,则需要创建并评估调用。以下是使用
mtcars
数据集的示例:

var1 <- "mpg"
var2 <- ">"
var3 <- "30"

expr <- call(var2, mtcars[[var1]], as.numeric(var3))

## or you could also construct a function call with substitute()
# expr <- substitute(
#     FUN(mtcars[[column]], value), 
#     list(FUN = as.name(var2), column = var1, value = as.numeric(var3))
# )

步骤1。生成所需表达式的字符向量:

expr<-paste(dat[[var1]],var2,var3,sep = " ")

我对R相当陌生,有很多最佳的方法。这与Richard Scriven的回答有些相似,但我的思维过程是这样的。

Anurag Priyadarshi,您的代码简短明了。。谢谢如果我发现较大数据集存在任何性能问题,我会通知您。
expr<-paste(dat[[var1]],var2,var3,sep = " ")
myLogicalVec<-sapply(expr, function(x) eval(parse(text=x)))
dat[myLogicalVec,]