我有一个很大的百分比向量(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?怎么了?
答案 0 :(得分: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
答案 1 :(得分:2)
计数错误的原因是
x [5]有效地计算每次不满足条件的事件
mail_return[i]>60 && mail_return[i]<=80
,
即,计算&gt;的项目。 80(正如你所料),但也计算了&lt; = 60的新项目(超出错误!)。
你可以替换......
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(...))
)不需要这样的长手代码(而且效率更高)。