如果数字大于0,我试图将一列数字划分为6个相等的类别。
已经尝试了
if (nost13$actsum > 0) nost13$actclass2 <- as.factor( as.numeric( cut(nost13$actsum ,6)))
else 0
虽然没有工作......
有什么问题?
答案 0 :(得分:1)
也许这个未经考验的答案就是答案。如果您首先提供数据对象,则可以提供经过测试的解决方案。关于什么是“平等类别”可能存在歧义。等数?或者相等的跨度?这回答了cut
将提供的相等跨度。
nost13$actclass2 <- ifelse(nost13$actsum > 0,
cut(nost13$actsum ,6), 0)
我怀疑在ifelse
内会发生数字强制。你的代码会尝试将0添加到可能已经流泪的因素中。如果你认为这是一个级别为“0” - “6”的因子,那么将整个ifelse(....)
包裹在factor(.)
中。
这是一些轻量级测试:
actclass2 <- ifelse(-100:100 > 0,
cut(-100:100 ,6), 0)
table(actclass2)
#------------
actclass2
0 4 5 6
101 33 33 34
因此,根据值的分布,您可能没有得到您想要的。这显示了对该策略的修改,可能会更令人满意:
> vals <- -100:100
> splits <- seq(min(vals[vals>0]),max(vals[vals>0]), length=8)[-8]
> actclass2 <- ifelse(vals > 0,
+ cut(vals ,breaks=splits ), 0)
> table(actclass2)
actclass2
0 1 2 3 4 5 6
101 14 14 14 14 14 14
需要一个长度= 8的序列来获得6个带切割的间隔,因为最大值被丢弃并需要7个边界来生成6个间隔。经过这一步之后,我认为findInterval函数会产生更清晰的成功之路。
> table( findInterval( vals, c(-Inf, 0, splits[-1], Inf) ))
1 2 3 4 5 6 7 8
100 16 14 14 14 14 14 15
findInterval
左侧的时间间隔与cut
的时间间隔关闭,其默认值在右侧关闭。