10

我试图将 -1 的值分配给我的向量中介于 2 和 5 之间的每个数字。

我认为 if - then 语句会起作用。我遇到了一些麻烦。我不认为 (2<x<5) 是正确的,但我不确定如何在 R 之间写。有人可以帮忙吗?谢谢

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

5 回答 5

25

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

尝试使用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)

注意

  • 因为2<x<5你需要写x > 2 & x < 5
  • cat将输出到控制台或文件/连接。它不会分配任何东西。
于 2012-10-18T02:10:57.713 回答
13

您可能只想用 -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
于 2012-10-18T02:16:32.363 回答
3

我将解决方案与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. 它几乎快两倍。

于 2015-09-24T12:42:29.647 回答
2

我更喜欢根据明确定义的数字区间为变量赋值是使用基本 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 语法明确定义区间相同的特异性水平。

于 2018-02-17T21:34:10.843 回答
1

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

library(TeachingDemos)

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

(x <- ifelse( 2 %<% x %<% 5, -1, x ) )
于 2012-10-18T15:53:43.427 回答