R构建一个条件为变量

时间:2017-06-08 21:31:15

标签: r function conditional-statements

我有一个data.frame,包含两列,时间和值。让我们说:

> s
>          time      value
>1  -1.40325749 -0.5282231
>2  -0.32640410 -1.8719568
>3  -0.26288196 -0.9861694
>4  -0.19906006 -0.8487832
>5  -0.18720951 -0.2248195
>6  -0.14219086  0.3387807
>7  -0.05981503  1.3872106
>8   0.37187516  2.0057095
>9   0.42432858  2.6805815
>10  1.19915563  1.9988563

我想根据具体情况构建一个过滤这些数据的函数。这是我的代码:

> select<-function(object,cond)
 {    
     subset(object,eval(deparse(substitute(cond))))
 }

如果我现在使用我的新功能如下:

>select(s,value<0)

我想只看到行,其中值为&lt; 0.例如。

> s
>          time      value
>1  -1.40325749 -0.5282231
>2  -0.32640410 -1.8719568
>3  -0.26288196 -0.9861694
>4  -0.19906006 -0.8487832
>5  -0.18720951 -0.2248195

但是,运行此代码后,我有一个错误,该子集必须是逻辑的。我尝试了所有我知道的&#34;值&lt; 0&#34;作为R的表达式可见。有人知道如何解决它吗?

Error in subset.data.frame(object, eval(deparse(substitute(cond)))) : 
'subset' must be logical 

此致 米甲

2 个答案:

答案 0 :(得分:0)

尝试以下任何一项:

select <- subset

select <- function(...) subset(...)

select <- function(data, cond) eval.parent(substitute(subset(data, cond)))

select <- function(data, cond) {
  mc <- match.call()
  mc[[1L]] <- quote(subset)
  m <- match(c("data", "cond"), names(mc), 0L)
  names(mc)[m] <- c("x", "subset")
  eval.parent(mc)
}

然后使用内置BOD data.frame

select(BOD, Time > 3)

答案 1 :(得分:0)

我也喜欢dplyr

library(dplyr)
s <- s %>%
     filter(value < 0)

按条件过滤行