r-创建一个逻辑列,用于确定行是否在任何列中包含字符串



我有以下数据帧:

df <- structure(list(x = c("cc", "aa", "BB", "dd"), y = c("ee", "dd",
"ff", "gg"), z = c("AA", "gg", "bb", "dd")), row.names = c(NA,
-4L), class = c("tbl_df", "tbl", "data.frame"))

我想创建一个二进制列,指示每一行是否包含"0";aa";(不区分大小写(。因此,在这种情况下,前两个值将为TRUE,最后一个值为FALSE。如何使用dplyr完成此操作?所有的答案都解释了如何过滤这些行,而不是如何预订保持

library(tidyverse)
df %>%
mutate(flag = pmap_lgl(., ~"aa" %in% str_to_lower(c(...))))

或使用rowwise:

df %>%
rowwise() %>%
mutate(flag = "aa" %in% str_to_lower(c_across(everything())))

data.table:

setDT(df)[, flag := transpose(.SD) %>% map_lgl(~"aa" %in% str_to_lower(.x))]

(transpose来自data.table包装(

我们也可以使用这个:

library(dplyr)
df %>%
rowwise() %>%
mutate(xyz = +any(grepl("aa", cur_data(), ignore.case = TRUE)))
# A tibble: 4 x 4
# Rowwise: 
x     y     z       xyz
<chr> <chr> <chr> <int>
1 cc    ee    AA        1
2 aa    dd    gg        1
3 BB    ff    bb        0
4 dd    gg    dd        0

在R基地,我们也可以这样做:

Reduce(`+`, apply(df, 1, (x) +(grepl("aa", x, , ignore.case = TRUE))) |>
t() |>
as.data.frame()) -> df$xyz
# A tibble: 4 x 4
# Rowwise: 
x     y     z       xyz
<chr> <chr> <chr> <int>
1 cc    ee    AA        1
2 aa    dd    gg        1
3 BB    ff    bb        0
4 dd    gg    dd        0

我们可以在if_any中使用矢量化选项

library(dplyr)
library(stringr)
df %>%
mutate(xyz = +(if_any(everything(), 
~ str_detect(., regex('aa', ignore_case = TRUE)))))

-输出

# A tibble: 4 x 4
x     y     z       xyz
<chr> <chr> <chr> <int>
1 cc    ee    AA        1
2 aa    dd    gg        1
3 BB    ff    bb        0
4 dd    gg    dd        0

最新更新