-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

あなたは交換することができます...

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 に答える