Hoe*_*elR 5 r pipe vector dplyr
我试图了解在操作向量时如何更好地在管道中使用if elseor 。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)
Run Code Online (Sandbox Code Playgroud)
我想在将它们放入数据框/小标题之前在向量中对其进行操作。如果字符串中有两个数字(例如 112 - 150),则将其替换为两个数字的平均值。我已经尝试过以下方法:
vector %>%
case_when(
str_detect(., "-") ~ . %>%
str_split_1(" - ") %>%
as.numeric() %>%
mean(),
T ~ .
)
Run Code Online (Sandbox Code Playgroud)
这是行不通的。单独而言,它的工作原理是:
"112 - 150" %>%
str_split_1(" - ") %>%
as.numeric() %>%
mean()
[1] 131
Run Code Online (Sandbox Code Playgroud)
然后我想也许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"
Run Code Online (Sandbox Code Playgroud)
我更喜欢没有传统 if 语句的建议:
vector %>%
{if (cond) ** else **}
Run Code Online (Sandbox Code Playgroud)
当使用管道编写时,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
Run Code Online (Sandbox Code Playgroud)
对于case_when,这仍然有效:
case_when(
str_detect(vector, "-") ~ vector %>%
str_split(' - ') %>%
map_dbl(~ mean(as.numeric(.x))),
T ~ as.numeric(vector)
)
Run Code Online (Sandbox Code Playgroud)