我想创建一个变量,用于标记多个变量中是否有一个或多个变量具有特定值。
week Mon Tues Weds Thurs Fri Sat
1 jon jon jon jon mary mary
2 jane jane jane jane jane jane
3 mary mary mary mary mary jane我想创建一个二进制变量来标记该周的每个星期,无论是星期一、星期三还是星期六,== "jon“或"mary”有没有办法做到这一点,而不是创建一个冗长的ifelse语句来分别检查每个变量?
week Mon Tues Weds Thurs Fri Sat flag
1 jon jon jon jon mary mary 1
2 jane jane jane jane jane jane 0
3 mary mary mary mary mary jane 1我试过了
df %>%
rowwise() %>%
mutate(flag = +any(c_across(Mon, Weds, Sat)
%in% ("jon", "mary")) %>%
ungroup()但是我得到了一个错误
Error: Problem with `mutate()` input `flag`.
x unused arguments (Mon, Weds, Sat)
i Input `flag` is `+...`.
i The error occurred in row 1.发布于 2020-09-13 04:30:14
df %>%
mutate(flag = colSums(apply(cbind(Mon, Weds, Sat), 1, `%in%`, c("jon", "mary"))) > 0)
# week Mon Tues Weds Thurs Fri Sat flag
# 1 1 jon jon jon jon mary mary TRUE
# 2 2 jane jane jane jane jane jane FALSE
# 3 3 mary mary mary mary mary jane TRUE我认为across的问题在于它试图针对每一列做一些事情,而不是对所有列进行汇总。让我们试试purrr::pmap insteadL
library(purrr)
df %>%
mutate(flag = pmap(list(Mon, Weds, Sat),
~ +any(unlist(...) %in% c("jon", "mary"))))
# week Mon Tues Weds Thurs Fri Sat flag
# 1 1 jon jon jon jon mary mary 1
# 2 2 jane jane jane jane jane jane 0
# 3 3 mary mary mary mary mary jane 1第三个(使用您的c_across请求):
df %>%
rowwise() %>%
mutate(flag = +any(c_across(c(Mon, Weds, Sat)) %in% c("jon", "mary"))) %>%
ungroup()
# # A tibble: 3 x 8
# week Mon Tues Weds Thurs Fri Sat flag
# <int> <chr> <chr> <chr> <chr> <chr> <chr> <int>
# 1 1 jon jon jon jon mary mary 1
# 2 2 jane jane jane jane jane jane 0
# 3 3 mary mary mary mary mary jane 1发布于 2020-09-13 06:14:01
如果我们使用map和reduce遍历列,我们可以使它更高效,而不是对行进行rowwise或循环
library(purrr)
library(dplyr)
df %>%
mutate(flag = map(select(., Mon, Weds, Sat), `%in%`, c("jon", "mary")) %>%
reduce(`|`) %>% `+`)
# week Mon Tues Weds Thurs Fri Sat flag
#1 1 jon jon jon jon mary mary 1
#2 2 jane jane jane jane jane jane 0
#3 3 mary mary mary mary mary jane 1base R中对应的选项是lapply/Reduce
df$flag <- +(Reduce(`|`, lapply(df[c('Mon', 'Weds', 'Sat')],
`%in%`, c("jon", "mary"))))数据
df <- structure(list(week = 1:3, Mon = c("jon", "jane", "mary"), Tues = c("jon",
"jane", "mary"), Weds = c("jon", "jane", "mary"), Thurs = c("jon",
"jane", "mary"), Fri = c("mary", "jane", "mary"), Sat = c("mary",
"jane", "jane")), class = "data.frame", row.names = c(NA, -3L
))发布于 2020-09-13 06:33:29
下面是使用rowSums + Reduce的另一个基本R选项
df$flag <- +(rowSums(
Reduce(
`+`,
lapply(
c("jon", "mary"),
`==`,
df[c("Mon", "Weds", "Sat")]
)
)
) > 0)这样的话
week Mon Tues Weds Thurs Fri Sat flag
1 1 jon jon jon jon mary mary 1
2 2 jane jane jane jane jane jane 0
3 3 mary mary mary mary mary jane 1https://stackoverflow.com/questions/63864431
复制相似问题