当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R dplyr case_match 通用向量化 switch()


此函数允许您对多个switch() 语句进行向量化。按顺序评估每种情况,每个元素的第一个匹配确定输出向量中的相应值。如果没有大小写匹配,则使用.default

case_match() 是 SQL "simple" CASE WHEN 语句的 R 等效项。

连接至case_when()

case_when() 在公式左侧使用逻辑表达式,而 case_match() 使用值与 .x 进行匹配。下面的两条语句大致是等价的:

case_when(
  x %in% c("a", "b") ~ 1,
  x %in% "c" ~ 2,
  x %in% c("d", "e") ~ 3
)

case_match(
  x,
  c("a", "b") ~ 1,
  "c" ~ 2,
  c("d", "e") ~ 3
)

用法

case_match(.x, ..., .default = NULL, .ptype = NULL)

参数

.x

要匹配的向量。

...

< dynamic-dots > 双边公式序列:old_values ~ new_value 。右侧 (RHS) 确定与左侧 (LHS) 匹配的所有 .x 值的输出值。

LHS 必须求值为与 .x 相同类型的向量。它可以是任意长度,允许您将多个 .x 值映射到同一 RHS 值。如果某个值在 LHS 中重复,即 .x 中的值与多种情况匹配,则使用第一个匹配项。

RHS 输入将被强制为其通用类型。每个 RHS 输入将为 recycled.x 的大小。

.default

.x 中的值与任何 LHS 输入都不匹配时使用的值。如果是NULL(默认值),则将使用缺失值。

.defaultrecycled.x 的大小。

.ptype

声明所需输出类型的可选原型。如果未提供,输出类型将从所有 RHS 输入和 .default 的通用类型中获取。

.x 大小相同、类型与 RHS 输入和 .default 的公共类型相同的向量(如果未被 .ptype 覆盖)。

也可以看看

例子

x <- c("a", "b", "a", "d", "b", NA, "c", "e")

# `case_match()` acts like a vectorized `switch()`.
# Unmatched values "fall through" as a missing value.
case_match(
  x,
  "a" ~ 1,
  "b" ~ 2,
  "c" ~ 3,
  "d" ~ 4
)
#> [1]  1  2  1  4  2 NA  3 NA

# Missing values can be matched exactly, and `.default` can be used to
# control the value used for unmatched values of `.x`
case_match(
  x,
  "a" ~ 1,
  "b" ~ 2,
  "c" ~ 3,
  "d" ~ 4,
  NA ~ 0,
  .default = 100
)
#> [1]   1   2   1   4   2   0   3 100

# Input values can be grouped into the same expression to map them to the
# same output value
case_match(
  x,
  c("a", "b") ~ "low",
  c("c", "d", "e") ~ "high"
)
#> [1] "low"  "low"  "low"  "high" "low"  NA     "high" "high"

# `case_match()` isn't limited to character input:
y <- c(1, 2, 1, 3, 1, NA, 2, 4)

case_match(
  y,
  c(1, 3) ~ "odd",
  c(2, 4) ~ "even",
  .default = "missing"
)
#> [1] "odd"     "even"    "odd"     "odd"     "odd"     "missing" "even"   
#> [8] "even"   

# Setting `.default` to the original vector is a useful way to replace
# selected values, leaving everything else as is
case_match(y, NA ~ 0, .default = y)
#> [1] 1 2 1 3 1 0 2 4

starwars %>%
  mutate(
    # Replace missings, but leave everything else alone
    hair_color = case_match(hair_color, NA ~ "unknown", .default = hair_color),
    # Replace some, but not all, of the species
    species = case_match(
      species,
      "Human" ~ "Humanoid",
      "Droid" ~ "Robot",
      c("Wookiee", "Ewok") ~ "Hairy",
      .default = species
    ),
    .keep = "used"
  )
#> # A tibble: 87 × 2
#>    hair_color    species 
#>    <chr>         <chr>   
#>  1 blond         Humanoid
#>  2 unknown       Robot   
#>  3 unknown       Robot   
#>  4 none          Humanoid
#>  5 brown         Humanoid
#>  6 brown, grey   Humanoid
#>  7 brown         Humanoid
#>  8 unknown       Robot   
#>  9 black         Humanoid
#> 10 auburn, white Humanoid
#> # ℹ 77 more rows
源代码:R/case-match.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 A general vectorised switch()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。