【问题标题】:Using logical operators stored in character variables while subsetting data frame in R在 R 中子集数据帧时使用存储在字符变量中的逻辑运算符
【发布时间】:2014-11-30 06:09:49
【问题描述】:

我的 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    

但这不起作用,因为我使用 var2 中的逻辑运算符的方式。

请建议我另一种解决此问题的方法。

【问题讨论】:

    标签: r logical-operators


    【解决方案1】:

    如果用户将这些变量作为字符输入,那么您需要创建和评估调用。下面是一个使用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))
    # )
    

    现在我们创建了一个未评估的调用 expr,然后可以使用 eval 评估它

    mtcars[eval(expr),]
    #                 mpg cyl disp  hp drat    wt  qsec vs am gear carb
    # Fiat 128       32.4   4 78.7  66 4.08 2.200 19.47  1  1    4    1
    # Honda Civic    30.4   4 75.7  52 4.93 1.615 18.52  1  1    4    2
    # Toyota Corolla 33.9   4 71.1  65 4.22 1.835 19.90  1  1    4    1
    # Lotus Europa   30.4   4 95.1 113 3.77 1.513 16.90  1  1    5    2
    

    【讨论】:

      【解决方案2】:

      Step1.制作所需表达式的字符向量:

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

      Step2.计算表达式以生成逻辑向量

      myLogicalVec<-sapply(expr, function(x) eval(parse(text=x)))
      

      Step3.在数据框中使用该逻辑向量

      dat[myLogicalVec,]
      

      我对 R 相当陌生,并且可以有最佳的方法来做到这一点。这有点类似于 Richard Scriven 的回答,但我的思考过程是这样的。

      【讨论】:

      【解决方案3】:

      (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
      ...
      

      (2) 元程序

      Here 是一章 - HadleyWickham 的高级 R 的表达式。在那里,他解释了如何编程“程序”的细节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        相关资源
        最近更新 更多