创建一个新变量,该变量是基于多个变量的逻辑

Create one new variable that is a logical based on multiple variables

我的数据如下所示:

var1 | var2| var3
"abc"|"bcd"|"cde"

我正在尝试创建一个标志字段来指示是否有任何值包含字符串。现在我有这样的东西,但觉得有更好的方法来做事:

create_flag <- function(data,field_name,string) {
  data %>% 
    mutate(!!enquo(field_name) := case_when(
      str_detect(var1,string) ~ T,
      str_detect(var2,string) ~ T,
      str_detect(var3,string) ~ T,
      TRUE ~ F
    ))
  }

我尝试了一个基于 map() 的函数。以下似乎没有按预期工作,因为它没有选择一些匹配案例。

data %>%     
   mutate(flag = pmap_lgl(list(var1,var2,var3),~any(str_detect(.,"string"))))

问题是您使用 pmap_lgl 的方式,我只会检查 var1。相反,您可以使用 dplyr 中的 rowwisec_across 重写您的函数以实现您想要的结果:

dat <- data.frame(
  var1 = "abc",
  var2 = "bcd",
  var3 = "cde"
)

library(dplyr)
library(stringr)

create_flag <- function(data, field_name, string) {
  data %>%
    rowwise() %>% 
    mutate(!!enquo(field_name) := any(str_detect(c_across(c(var1, var2, var3)), string))) %>% 
    ungroup()
}

create_flag(dat, "flag", "ba")
#> # A tibble: 1 x 4
#>   var1  var2  var3  flag 
#>   <chr> <chr> <chr> <lgl>
#> 1 abc   bcd   cde   FALSE
create_flag(dat, "flag", "de")
#> # A tibble: 1 x 4
#>   var1  var2  var3  flag 
#>   <chr> <chr> <chr> <lgl>
#> 1 abc   bcd   cde   TRUE

reprex package (v1.0.0)

于 2021 年 2 月 10 日创建