【问题标题】:How to use conditional-stataments as an input in a R function如何使用条件语句作为 R 函数的输入
【发布时间】:2021-05-02 06:50:17
【问题描述】:

我正在编写一个函数,其中一个输入是条件。看下面的例子

样本数据集

ab <- matrix(1:100, ncol = 5)

功能

dat 是一个矩阵/数据框(例如ab

con 是我想在函数内部使用的条件(例如&gt; 50=&lt; 80 等)

fil_dat <- function (dat, con ) {
  fildat <- data[which(rowMeans(dat)"the condition *con* should go here"),]
  return(fildat)
}

如何在此处插入条件?此外,必须有其他方法对fildat 进行子集化和派生。我认为使用dplyr::filter 会更容易。但我想不出正确的方法来做到这一点。有人可以帮忙吗?而且,更进一步,我可以一次使用多个条件吗,比如&gt; 50 &amp; &lt;= 80

编辑:对不起,我之前忘了提这个。如果该函数还可以处理 NULL 条件语句(即无条件),那就太好了。我知道这对于这个玩具示例没有意义,但对于我的实际功能,它确实如此。我也知道我可以在函数内写一个if-loop 来克服这个问题。但如果子集函数本身可以处理这个问题,那就太好了。

【问题讨论】:

    标签: r function conditional-statements


    【解决方案1】:

    或许你可以试试eval

    fil_dat <- function (dat, con = NULL ) {
      if (is.null(con)) return(dat)
      return(eval(str2expression(sprintf("dat[which(rowMeans(dat)%s),]",con))))    
    }
    

    给了

    > fil_dat(ab,"<=50")
          [,1] [,2] [,3] [,4] [,5]
     [1,]    1   21   41   61   81
     [2,]    2   22   42   62   82
     [3,]    3   23   43   63   83
     [4,]    4   24   44   64   84
     [5,]    5   25   45   65   85
     [6,]    6   26   46   66   86
     [7,]    7   27   47   67   87
     [8,]    8   28   48   68   88
     [9,]    9   29   49   69   89
    [10,]   10   30   50   70   90
    
    > fil_dat(ab)
          [,1] [,2] [,3] [,4] [,5]
     [1,]    1   21   41   61   81
     [2,]    2   22   42   62   82
     [3,]    3   23   43   63   83
     [4,]    4   24   44   64   84
     [5,]    5   25   45   65   85
     [6,]    6   26   46   66   86
     [7,]    7   27   47   67   87
     [8,]    8   28   48   68   88
     [9,]    9   29   49   69   89
    [10,]   10   30   50   70   90
    [11,]   11   31   51   71   91
    [12,]   12   32   52   72   92
    [13,]   13   33   53   73   93
    [14,]   14   34   54   74   94
    [15,]   15   35   55   75   95
    [16,]   16   36   56   76   96
    [17,]   17   37   57   77   97
    [18,]   18   38   58   78   98
    [19,]   19   39   59   79   99
    [20,]   20   40   60   80  100
    

    【讨论】:

    • 谢谢。它一次完美地处理一种情况。如果需要,我可以针对第二种情况再次执行此操作。我仍然想知道是否有更好的选择来一次处理多个条件。
    • @MaMu 你能举一些你想使用的多个条件的例子吗?
    • 我原来的问题中已经有。
    • @MaMu 这是迄今为止我能做的最简单的一个。也许我们可以等待其他更出色的解​​决方案。
    【解决方案2】:

    这是一个解决方案,同样是 eval,但在 parse 之后。

    fil_dat <- function (data, con, drop = FALSE) {
      con <- paste("rowMeans(data)", con)
      i <- eval(parse(text = con))
      data[which(i), , drop = drop]
    }
    
    ab <- matrix(1:100, ncol = 5)
    
    fil_dat(ab, ">= 50")
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]   10   30   50   70   90
    # [2,]   11   31   51   71   91
    # [3,]   12   32   52   72   92
    # [4,]   13   33   53   73   93
    # [5,]   14   34   54   74   94
    # [6,]   15   35   55   75   95
    # [7,]   16   36   56   76   96
    # [8,]   17   37   57   77   97
    # [9,]   18   38   58   78   98
    #[10,]   19   39   59   79   99
    #[11,]   20   40   60   80  100
    
    fil_dat(ab, "== 50")
    #     [,1] [,2] [,3] [,4] [,5]
    #[1,]   10   30   50   70   90
    
    fil_dat(ab, "== 50", TRUE)
    #[1] 10 30 50 70 90
    

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 2022-11-20
      • 2020-02-21
      • 1970-01-01
      • 2021-12-17
      • 2020-10-04
      相关资源
      最近更新 更多