【发布时间】:2017-09-05 02:37:33
【问题描述】:
希望我的标题有意义。我有一个包含一列数值的数据框,我想使用此列创建一个新列,其中数值根据它们的值“映射”到不同的存储桶。下面是一些测试数据,以及我目前用来解决此问题的粗略嵌套 ifelse() 方法。我希望以一种不涉及嵌套 ifelse() 语句的更好方式对此进行编码,因为这种方法不适用于许多存储桶:
mydf = data.frame(strings = letters[1:10],
numerics = c(0.2, 0.4, 1.3, 5.2, 3.3, 2.1, 7.3, 1.1, 4.3, 8.3),
stringsAsFactors = FALSE)
这是我的测试数据框,这是我解决问题的嵌套 ifelse() 方法:
mydf$buckets = ifelse(mydf$numerics <= 2, 0,
ifelse(mydf$numerics <= 4, 1,
ifelse(mydf$numerics <= 5, 2,
ifelse(mydf$numerics <= 7, 3, 4))))
上面的代码所做的是将数值列映射如下:
- 所有值
- 所有值
- 所有值
- 所有值
- 所有值 >= 7 到 4
这种方法仅适用于少量存储桶。对此的任何帮助表示赞赏!谢谢,
【问题讨论】:
-
cut(mydf$numerics, breaks = c(0, 2, 4, 5, 7, 10), labels = c(0, 1, 2, 3, 4)) -
我认为您会对来自
dplyr包的case_when感兴趣。扩展性好,代码清晰。 -
cutfrom base R 是专门为这种情况设计的。对于非单调映射,您可以创建一个查找表并合并。 -
虽然这里有不同的、独特的答案,但我同意我的问题与链接的其他问题重复。正如迈克尔所说,这似乎正是 cut() 的用途。我也喜欢 case_when
标签: r data-manipulation