根据数字的不同范围,将数字映射到R中的分类值

时间:2017-09-05 02:37:34

标签: r data-manipulation

希望我的头衔有意义。我有一个包含数值列的数据框,我想使用此列创建一个新列,其中数值被映射'根据其值来分配不同的桶。下面是一些测试数据,以及我目前用来解决这个问题的粗略的边缘嵌套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))))

上面的代码所做的是映射数值列中的值,如下所示:

  • 所有值&lt; 2转到0
  • 所有值&lt; 4转到1
  • 所有值&lt; 5转到2
  • 所有值&lt; 7转到3
  • 所有值&gt; = 7到4

这种方法对于超过少量的桶不能很好地扩展。对此有任何帮助表示赞赏!谢谢,

2 个答案:

答案 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