向量上管道运算符中的 Case_when 语句

2024-03-05

我试图了解如何更好地使用if else or case_when在操作向量时在管道中。在抓取网站的元素后,我留下了这个向量:

[1] "66"        "121"       "112 - 150" "211"       "197"       "25"        "72"       
[8] "59"        "100"       "69 - 194" 

c("66", "121", "112 - 150", "211", "197", "25", "72", "59", "100", 
"69 - 194")

library(tidyverse)
library(stringr) (1.5.0)

我想在将它们放入数据框/小标题之前在向量中对其进行操作。 如果字符串中有两个数字(例如 112 - 150),则将其替换为两个数字的平均值。我已经尝试过以下方法:

vector %>%
  case_when(
    str_detect(., "-") ~ . %>%
      str_split_1(" - ") %>%
      as.numeric() %>%
      mean(),
    T ~ .
  ) 

这是行不通的。单独而言,它的工作原理是:

"112 - 150" %>% 
  str_split_1(" - ") %>% 
  as.numeric() %>% 
  mean()

[1] 131

然后我想也许case_when()不适用于向量。但它显然是这样的:

case_when(
  vector == "66" ~ "SIXSIX", 
  TRUE ~ "NOT 66"
)

 [1] "SIXSIX" "NOT 66" "NOT 66" "NOT 66" "NOT 66" "NOT 66" "NOT 66" "NOT 66"
 [9] "NOT 66" "NOT 66"

我更喜欢没有传统 if 语句的建议:

vector %>% 
  {if (cond) ** else **}

当用管道写时,vector %>% case_when(...)评估为case_when(vector, ...),但因为即使是第一个参数case_when必须是双面公式,否则会返回错误。因此,消息如下:

错误于case_when():!情况1 (.) 必须是双边公式, 不是字符向量。

在这种情况下,您不需要case_when,因为您可以申请mean甚至单个元素:

library(purrr)
library(stringr)
library(dplyr)

vector %>% 
  str_split(' - ') %>% 
  map_dbl(~ mean(as.numeric(.x)))
#[1]  66.0 121.0 131.0 211.0 197.0  25.0  72.0  59.0 100.0 131.5

With case_when,这仍然有效:

case_when( 
  str_detect(vector, "-") ~ vector %>% 
    str_split(' - ') %>% 
    map_dbl(~ mean(as.numeric(.x))),
  T ~ as.numeric(vector)
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向量上管道运算符中的 Case_when 语句 的相关文章

随机推荐