我有以下数据帧:
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