首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数在dplyr::case_when()中循环时中断

函数在dplyr::case_when()中循环时中断
EN

Stack Overflow用户
提问于 2021-09-16 04:56:17
回答 1查看 34关注 0票数 1

我有一个函数,它提取范围(在字符串中)的最小值或最小值,这些值在个别情况下似乎很好地工作。

但是,当我试图在case_when()中使用它时,它的行为并不像预期的那样。

可复制示例

代码语言:javascript
运行
复制
library(dplyr)
library(tibble)
library(stringr)


val_from_range <- function(.str, .fun = "min"){
  str_extract_all(.str, "\\d*\\.?\\d+") |> 
    unlist() |> 
    as.numeric() |> 
    (\(x) if (.fun == "min") x |> min() 
     else if (.fun == "max") x |> max())()
  
}

tibble(x = c("5-6", "4", "6-9", "5", "NA")) |> 
  mutate(min = case_when(str_detect(x, "-") ~ val_from_range(x, "min"))) |> 
  mutate(max = case_when(str_detect(x, "-") ~ val_from_range(x, "max")))

# A tibble: 5 x 3
  x       min   max
  <chr> <dbl> <dbl>
1 5-6       4     9
2 4        NA    NA
3 6-9       4     9
4 5        NA    NA
5 NA       NA    NA

然而,我想要

代码语言:javascript
运行
复制
# A tibble: 5 x 3
  x       min   max
  <chr> <dbl> <dbl>
1 5-6       5     6
2 4        NA    NA
3 6-9       6     9
4 5        NA    NA
5 NA       NA    NA

该函数在个别情况下按预期执行,

代码语言:javascript
运行
复制
> val_from_range("5-6", "min")
[1] 5
> val_from_range("5-6", "max")
[1] 6
> val_from_range("5-6-8-10", "max")
[1] 10

任何帮助都将不胜感激。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-16 05:04:26

需要进行几次更改。该函数一次只对一个值工作。如果传入多个值,它将忽略第二个值。

代码语言:javascript
运行
复制
val_from_range("5-6", "min")
#[1] 5

val_from_range(c("5-6", "8-10"), "min")
#[1] 5

要把它们一个接一个地传递出去,你可以借助rowwise。其次,case_when仍然对不满足条件的值执行函数,因此它返回"NA"值的警告。我们可以在这里使用if/else来避免这种情况。

代码语言:javascript
运行
复制
library(dplyr)
library(stringr)

tibble(x = c("5-6", "4", "6-9", "5", "NA")) %>%
  rowwise() %>%
  mutate(min = if(str_detect(x, "-")) val_from_range(x, "min") else NA,
         max = if(str_detect(x, "-")) val_from_range(x, "max") else NA) %>%
  ungroup

#   x       min   max
#  <chr> <dbl> <dbl>
#1 5-6       5     6
#2 4        NA    NA
#3 6-9       6     9
#4 5        NA    NA
#5 NA       NA    NA
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69202548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档