1

我有一个名为“数据”的 DF,大约 10 000 行长(为了说明起见,我们会说 10 000)。我有一个名为“SimDelta”的数字列,我想将其放入 4 个类别(0-0.25、0.25-0.5、0.5-0.75 和 >0.75),我使用这段代码制作:

data$SimDeltaClass = 
       ifelse(data$SimDelta>0.75, ">0.75",
       ifelse(data$SimDelta<0.75&data$SimDelta>0.5, "0.5-0.75",
       ifelse(data$SimDelta<0.5&data$SimDelta>0.25, "0.25-0.5",
       ifelse(data$SimDelta<0.25&data$SimDelta>0, "0-0.25", "void"))))

然后将其绘制到四个类别的箱线图中,每个类别中的样本数写在框上方,使用:

text(x=1,y=1.07,length(data$rMF[data$SimDeltaClass=="0-0.25"]),cex=0.8,col="black")
text(x=2,y=1.07,length(data$rMF[data$SimDeltaClass=="0.25-0.5"]),cex=0.8,col="black")
text(x=3,y=1.07,length(data$rMF[data$SimDeltaClass=="0.5-0.75"]),cex=0.8,col="black")
text(x=4,y=1.07,length(data$rMF[data$SimDeltaClass==">0.75"]),cex=0.8,col="black")

这部分(length(data$rMF[data$SimDeltaClass=="0-0.25"]))应该给出每组的数量。当这 4 个计数相加时,我得到的值超过 14 000,远远超过我预期的 10 000。

为什么这不能正确形成类别?我基于我之前写的一篇非常有效的文章,所以我不确定 R(或我自己)正在努力解决什么问题。

显然我需要编辑 ifelse() 部分,因为它们包含错误的赋值,但我不知道该怎么做

注意:没有错误消息或警告,并且 str() 与有效的版本相同

4

1 回答 1

2

很可能你有 NA 会影响长度。

> x = c(1, NA)
> x[x==1]
[1]  1 NA

使用cut而不是ifelse(不带参数的默认labels=更好)。

set.seed(123); x = c(runif(10, -1, 2), NA)
y = cut(x, c(-Inf, seq(0, .75, .25), Inf), 
        labels=c("void", "0-0.25", "0.25-0.5", "0.5-0.75", ">0.75"))

导致

> y
 [1] void     >0.75    0-0.25   >0.75    >0.75    void     0.5-0.75 >0.75   
 [9] 0.5-0.75 0.25-0.5 <NA>    
Levels: void 0-0.25 0.25-0.5 0.5-0.75 >0.75

用于table汇总数据。

> table(y)
y
    void   0-0.25 0.25-0.5 0.5-0.75    >0.75 
       2        1        1        2        4 
> table(y, useNA="ifany")
y
    void   0-0.25 0.25-0.5 0.5-0.75    >0.75     <NA> 
       2        1        1        2        4        1 

text是矢量化的。

text(1:4, 1.07, table(y)[2:5])

完整解决方案(经rg255测试)

data$SimDeltaClass <- cut(data$SimDelta, c(-Inf, seq(0, .75, .25), Inf),
    labels=c("void", "0-0.25", "0.25-0.5", "0.5-0.75", ">0.75"))
text(x=1:4, y=1.07, table(data$SimDeltaClass[fdr])[2:5], cex=0.8, col="black")
于 2013-04-22T13:35:53.677 回答