我在使用R中的for循环时遇到问题。以下代码
a <- seq(-2, 5)
for(i in 1:length(a)){
a[i] <- if(a[i] <= 0) "aa" else a[i]
}
应该产生以下向量
> a
[1] "aa" "aa" "aa" "1" "2" "3" "4" "5"
相反,我们有以下结果:
> a
[1] "aa" "-1" "aa" "1" "2" "3" "4" "5"
为什么R不能用“aa”代替“-1”?
我们尝试了另一种解决方案,但效果很好:
a <- seq(-2, 5)
b <- NULL
for(i in 1:length(a)){
b[i] <- if(a[i] <= 0) "aa" else a[i]
}
它产生了预期的结果:
> b
[1] "aa" "aa" "aa" "1" "2" "3" "4" "5"
为什么后一个例子工作正常而第一个没有呢?
非常感谢你的帮助!
最好的问候!!
答案 0 :(得分:4)
整理顺序可能不像您(或Matthew)所理解的那样。在操作系统的词法排序中,字符“ - ”可能不会更低。字符串比较是特定于操作系统的。 (参见?Comparison
)第一次替换后,整个矢量被强制转换为角色,如果"-" > 0
在您的机器上返回TRUE,那么您就得到了答案。我敢打赌,这段代码将按照您的预期行事:
a <- seq(-2, 5)
for(i in 1:length(a)){
a[i] <- if( as.numeric(a[i]) <= 0) "aa" else a[i]
}
我怀疑Henrik的建议也应符合您的期望,因为它会先从数字比较中创建一个逻辑向量,然后从“aa”和a
中选择。
(在第二个例子中,没有强制向量到字符。)