首页 > 解决方案 > 如何协调 purrr::map 与 case_when

问题描述

我想根据预定义的阈值对变量进行分类,如下所示:

library(tidyverse)

df <- tibble(values = sample(1:50))


classes <- c("A","B","C","D")
upper <- c(10,19,34,50)
lower <- c(0, upper[1:length(upper)-1])

segment <- df %>% 
  mutate(
    class = case_when(
      values >= lower[1] & values < upper[1] ~ classes[1],
      values >= lower[2] & values < upper[2] ~ classes[2],
      values >= lower[3] & values < upper[3] ~ classes[3],
      values >= lower[4] & values < upper[4] ~ classes[4]
    )
  )

将生成一个新变量class,该变量采用 中定义的类名classes。目前case_when对每个单独的条目进行硬编码classes。只要类的数量仍然很少,这很好,但是如果我想增加类的数量,硬编码解决方案变得不切实际。是否可以在 case_when 中合并 purrr::map 来处理这个问题?

以下实施无效:

segment <- df %>% 
  mutate(
    class = case_when(
      purrr::map(values >= lower & values < upper ~ classes)
    )
  )

标签: rdplyrtidyversepurrr

解决方案


看起来你可以只使用一个cut函数:

breaks <- c(0,10,19,34,50)
labels <- c("A","B","C","D")
df$class <- cut(df$values, breaks = breaks, labels = labels)

推荐阅读