我试图将 -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)
}
我试图将 -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)
}
您的代码中有许多语法错误。
尝试使用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
将输出到控制台或文件/连接。它不会分配任何东西。您可能只想用 -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
我将解决方案与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
. 它几乎快两倍。
我更喜欢根据明确定义的数字区间为变量赋值是使用基本 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 语法明确定义区间相同的特异性水平。
这是另一种与原始方法更相似的方法:
library(TeachingDemos)
x <- c(3.2,6,7.8,1,3,2.5)
(x <- ifelse( 2 %<% x %<% 5, -1, x ) )