-7

我有一个很大的百分比向量(0-100),我试图计算其中有多少在特定的 20% 存储桶中(<20、20-40、40-60,60-80,80-100)。该向量的长度为 129605,并且没有 NA 值。这是我的代码:

x<-c(0,0,0,0,0)
for(i in 1: length(mail_return))
{
    if (mail_return[i]<=20)
    {
        x[1] = x[1] + 1
    }
    if (mail_return[i]>20 && mail_return[i]<=40)
    {
        x[2] = x[2] + 1
    }
    if (mail_return[i]>40 && mail_return[i]<=60)
    {
        x[3] = x[3] + 1
    }
    if (mail_return[i]>60 && mail_return[i]<=80)
    {
        x[4] = x[4] + 1
    }
    else
    {   
        x[5] = x[5] + 1
    }
}

但是sum(x)给我长度133171。不应该是向量的长度,129605吗?怎么了?

4

2 回答 2

10

我喜欢findInterval这些类型的任务:

x <- c(1,2,3,20,21,22,40,41,42,60,61,62,80,81,82)
table(findInterval(x,c(0,20,40,60,80)))


1 2 3 4 5 
3 3 3 3 3 
于 2012-11-07T22:42:54.980 回答
2

错误计数的原因
x[5] 有效地计算了每一次不满足条件的事件
mail_return[i]>60 && mail_return[i]<=80
即计算 > 80 的项目(如您所料),但也计算 <= 60 的新项目(outch !那个bug!)。

你可以换...

if (mail_return[i]>60 && mail_return[i]<=80)
{
    x[4] = x[4] + 1
}
else
{   
    x[5] = x[5] + 1
}

经过...

if (mail_return[i]>60 && mail_return[i]<=80)
{
    x[4] = x[4] + 1
}

if (mail_return[i] >80)
{   
    x[5] = x[5] + 1
}

...解决问题。

但正如其他答案所暗示的那样,有更好的习惯用法来查找table(findInterval(...))不需要这种速记代码(并且更有效)的计数(例如)。

于 2012-11-07T22:41:12.400 回答