如果数字介于两个数字之间,则分配一个值

时间:2012-10-18 02:08:04

标签: r

我试图将值-1分配给我的向量中介于2和5之间的每个数字。 我认为if - then声明会起作用。我遇到了一些麻烦。我不认为(2

x <- c(3.2,6,7.8,1,3,2.5)
if (2<x<5){
    cat(-1)
} else {
    cat (x)
}

5 个答案:

答案 0 :(得分:18)

您的代码中存在许多语法错误。

尝试使用findInterval

x[findInterval(x, c(2,5)) == 1L] <- -1
x
## [1]  -1.0  6.0  7.8  1.0 -1.0 -1.0

阅读?findInterval,了解有关findInterval

使用的更多详细信息

您也可以使用replace

replace(x, x > 2 & x < 5, -1)

请注意

  • for 2<x<5您需要撰写x > 2 & x < 5
  • cat将输出到控制台或文件/连接。它不会分配任何东西。

答案 1 :(得分:10)

您可能只想用-1替换这些元素。

> x[x > 2 & x < 5] <- -1; x
[1] -1.0  6.0  7.8  1.0 -1.0 -1.0

您也可以使用ifelse

> ifelse(x > 2 & x < 5, -1, x)
[1] -1.0  6.0  7.8  1.0 -1.0 -1.0

答案 2 :(得分:2)

我将解决方案与microbenchmark

进行了比较
library(microbenchmark)
library(TeachingDemos)

x = runif(100000) * 1000
microbenchmark(200 %<% x %<% 500
               , x > 200 & x < 500
               , findInterval(x, c(200, 500)) == 1
               , findInterval(x, c(200, 500)) == 1L
               , times = 1000L
               )

结果如下:

                               expr       min        lq      mean    median        uq       max neval
                  200 %<% x %<% 500 17.089646 17.747136 20.477348 18.910708 21.302945 113.71473  1000
                  x > 200 & x < 500  6.774338  7.092153  8.746814  7.233512  8.284603 103.64097  1000
  findInterval(x, c(200, 500)) == 1  3.578305  3.734023  5.724540  3.933615  6.777687  91.09649  1000
 findInterval(x, c(200, 500)) == 1L  2.042831  2.115266  2.920081  2.227426  2.434677  85.99866  1000

你应该findInterval。 请考虑将其与1L进行比较,而不是1。 它几乎快了两倍。

答案 3 :(得分:1)

这是另一种与原始方法更相似的方法:

library(TeachingDemos)

x <- c(3.2,6,7.8,1,3,2.5)

(x <- ifelse( 2 %<% x %<% 5, -1, x ) )

答案 4 :(得分:0)

我希望根据明确定义的数字间隔为变量赋值是使用基本R语法:

 DF$NewVar[DF$LowerLimit <= DF$OriginalVar & DF$OriginalVar < DF$UpperLimit] = "Normal"
 DF$NewVar[DF$LowerLimit < DF$OriginalVar] = "Low"
 DF$NewVar[DF$OriginalVar >= DF$UpperLimit] = "High"

我认为这种语法比任何数量的R函数更清晰,主要是因为代码可以快速定制以指定包含性和排除性间隔。在实践中,遇到间隔可以定义为包含(即[-x到+ x])或排除(即(-x到+ x))或组合(即[ - ]的情况是很常见的。 x到+ x))。

此外,如果其他人稍后正在查看代码,则基本语法可以提供代码的清晰度。每个独特的函数库似乎都有自己独特的略有不同的语法,以达到与使用基本R语法清晰定义区间相同的特异性。