使用存储在字符变量中的逻辑运算符在R中对数据帧进行子集设置
我的R脚本从用户那里获得三个输入,它们被读入var1、var2和var3 我正在尝试对数据帧执行一个简单的子集操作。我思维的伪代码是 如下所示:使用存储在字符变量中的逻辑运算符在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.
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,]