希望我的头衔有意义。我有一个包含数值列的数据框,我想使用此列创建一个新列,其中数值被映射'根据其值来分配不同的桶。下面是一些测试数据,以及我目前用来解决这个问题的粗略的边缘嵌套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))))
上面的代码所做的是映射数值列中的值,如下所示:
这种方法对于超过少量的桶不能很好地扩展。对此有任何帮助表示赞赏!谢谢,
答案 0 :(得分:3)
尝试使用基础R中的findInterval
函数:
findInterval(mydf$numerics,c(2,4,5,7))
[1] 0 0 0 3 1 1 4 0 2 4
答案 1 :(得分:3)
我非常喜欢在@tictocchoc评论中已经提到的这种情况下使用case_when
:
suppressPackageStartupMessages(library(tidyverse))
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)
mydf %>%
mutate(buckets = case_when(
numerics < 2 ~0,
numerics < 4 ~1,
numerics < 5 ~2,
numerics < 7 ~3,
numerics >= 7 ~4
))
#> strings numerics buckets
#> 1 a 0.2 0
#> 2 b 0.4 0
#> 3 c 1.3 0
#> 4 d 5.2 3
#> 5 e 3.3 1
#> 6 f 2.1 1
#> 7 g 7.3 4
#> 8 h 1.1 0
#> 9 i 4.3 2
#> 10 j 8.3 4