if else并在r中分成类别

时间:2016-05-15 15:58:45

标签: r if-statement

如果数字大于0,我试图将一列数字划分为6个相等的类别。

已经尝试了

if (nost13$actsum > 0) nost13$actclass2 <- as.factor( as.numeric( cut(nost13$actsum ,6)))
else 0

虽然没有工作......

有什么问题?

1 个答案:

答案 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的时间间隔关闭,其默认值在右侧关闭。