2

如果我用一个字符替换一些值,data[data<0] <- "Down"然后通过:data[data>0] <- "Up"我将所有值都设置为“Up”,但是如果我反转替换,我会以我喜欢的方式工作。

data<-runif(30, min=-5, max=5)
data[data<0]<-"Down"
data[data>0]<-"Up"
#[1] "up" "up" "up" "up" "up" "up" "up" "up" "up" "up" "up" "up" "up" "up" "up"
#[16] "up" "up" "up" "up" "up" "up" "up" "up" "up" "up" "up" "up" "up" "up" "up"

但如果我这样做,我会得到正确的结果:

data<-runif(30, min=-5, max=5)
data[data>0]<-"Up"
data[data<0]<-"Down"
#[1] "down" "up"   "up"   "down" "down" "down" "down" "down" "down" "down"
#[11] "down" "down" "up"   "down" "down" "down" "up"   "up"   "down" "up"  
#[21] "up"   "down" "up"   "up"   "down" "down" "up"   "up"   "down" "down"

解决方案很简单,做第二个,但我很好奇为什么会发生这种情况。起初我以为这与转换为字符有关,但不可能是这样,因为那样更改顺序不会影响或会以相同的方式影响。任何想法?

4

2 回答 2

2

R 中的向量只能保存一种类型的值。矢量最初是用数值创建的。

在您的第一段代码 ( data[data<0]<-"Down") 中,您的分配将矢量模式从数字转换为字符。向量中的其余数字已从数字模式更改为字符模式。在该分配结束时,向量看起来像......

 [1] "Down"              "4.50482521206141"  "Down"             
 [4] "Down"              "Down"              "Down"             
 [7] "3.81024733651429"  "1.01603321265429"  "Down"             
[10] "3.30486473860219"  "4.82019837480038"  "1.3452106853947"  
[13] "2.02783531043679"  "Down"              "Down"             
[16] "Down"              "Down"              "Down"             
[19] "4.59091864991933"  "Down"              "2.09894138388336" 
[22] "Down"              "0.638334625400603" "1.58013242762536" 
[25] "2.14735288871452"  "Down"              "1.67530178790912" 
[28] "4.91423513041809"  "Down"              "1.71986542874947" 

当涉及到第二次比较时 - 发生了隐式类型转换。R 不会让你比较数字和字符串。所以数字 0 被转换为字符串“0”。(data[data>0]即被强迫data[data>"0"]

这就是为什么它没有像你想象的那样工作。(所有值为“down”的字符串和以数字作为字符串的所有字符串都测试 TRUE 以大于字符串“0”。)

在第二个示例中,数字字符串以“-”开头,在字符编码中小于“0”的字符编码。

于 2013-11-04T12:58:59.450 回答
1

解决方案是避免转换为字符,并同时进行 2 个测试:

ifelse(data>0,"Up","Down")

编辑

为了解释发生了什么,奇怪的是 R 使用符号“-”来检查字符是负数还是正数。

"-a" < 0
[1] TRUE

因此,当您按此顺序(> 然后 <)进行操作时,您会保留该标志并且它可以工作。

编辑 “-”在 ASCII 中排在“0”之前。这是一个可以接受 ascii 字符并返回十进制值的函数:

asc <- function(x) { strtoi(charToRaw(x),16L) }
> asc("0")
[1] 48
> asc("-")
[1] 45
于 2013-11-04T12:58:22.113 回答