【问题标题】:Map numerics to categorical values in R, based on different ranges for the numerics [duplicate]根据数字的不同范围,将数字映射到 R 中的分类值 [重复]
【发布时间】: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 感兴趣。扩展性好,代码清晰。
  • cut from base R 是专门为这种情况设计的。对于非单调映射,您可以创建一个查找表并合并。
  • 虽然这里有不同的、独特的答案,但我同意我的问题与链接的其他问题重复。正如迈克尔所说,这似乎正是 cut() 的用途。我也喜欢 case_when

标签: r data-manipulation


【解决方案1】:

尝试在基础 R 中使用 findInterval 函数:

 findInterval(mydf$numerics,c(2,4,5,7))
   [1] 0 0 0 3 1 1 4 0 2 4

【讨论】:

  • 这很好,比 cut() 更准确地解决了我的问题,尽管 cut() 看起来有更多用例
【解决方案2】:

我真的很喜欢在这种情况下使用case_when,正如@tictocchoc 在cmets 中已经提到的那样:

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

【讨论】:

  • 是的,我也喜欢这个解决方案——不过我认为基本的 R 解决方案要简单一些,但这也是一个不错的解决方案。
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多