我试图将值-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)
}
答案 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)
请注意
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语法清晰定义区间相同的特异性。