创建一个新变量,该变量是基于多个变量的逻辑
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
中的 rowwise
和 c_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 日创建
我的数据如下所示:
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
中的 rowwise
和 c_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 日创建