當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。