For循环失败替换-1

时间:2013-11-13 22:29:59

标签: r

我在使用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" 

为什么后一个例子工作正常而第一个没有呢?

非常感谢你的帮助!

最好的问候!!

1 个答案:

答案 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中选择。

(在第二个例子中,没有强制向量到字符。)