【发布时间】:2016-05-14 06:00:09
【问题描述】:
我经常发现自己试图从一个数值变量 + 一组用户提供的范围中创建一个分类变量。
例如,假设我有一个带有数字变量 df$V 的 data.frame,并想创建一个新变量 df$VCAT,这样:
-
df$VCAT= 0 如果df$V等于 0 -
df$VCAT= 1 如果df$V介于 0 到 10 之间(即 (0,10)) -
df$VCAT= 2 是df$V等于 10(即 [10,10]) -
df$VCAT= 3 是df$V在 10 到 20 之间(即 (10,20)) -
df$VCAT= 4 是df$V大于或等于 20(即 [20,Inf])
我目前正在通过自己对“评分函数”进行硬编码来做到这一点,方法是:
df = data.frame(V = seq(1,100))
df = df %>% mutate(VCAT = (V>0) + (V==10) + 2*(V>10) + (V>=20))
我想知道在 R 中是否有更简单的 hacky 方法来执行此操作,最好使用dplyr(以便我可以链接命令)。理想情况下,我正在寻找一个可以在mutate 中使用的短函数,它将接收变量V 和一个描述范围的向量,例如buckets。
请注意,buckets 在这里可能没有以最佳方式描述,因为我不清楚它如何允许用户自定义范围的端点。
【问题讨论】:
-
你知道
cut()吗?查看?cut或者甚至Hmisc::cut2()。 -
你想让你的函数接受一个向量加上
buckets并返回一个看起来像上面结果的数据框吗?或者你想要一个可以传递给mutate的向量和buckets的函数? -
@jamieRowen 最好是可以传递给
mutate的东西。 -
@JasonAizkalns 我不知道
cut或cut2,但它们似乎可以解决问题。也就是说,我确定如何处理点(例如 [0,0] 之类的区间),以及它是否可以与mutate.合并 -
@BerkU。我最初会建议削减,但它并没有像你的问题所暗示的那样处理你的最终价值。感谢@Henrik 编辑,
findInterval在这里似乎是一个更好的建议:您也可以将它传递给 mutate,所以我建议它解决您的问题。
标签: r dplyr intervals categorical-data binning