首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有效地检查变量,检查R中的特定值,并标记包含该特定值的行?

如何有效地检查变量,检查R中的特定值,并标记包含该特定值的行?
EN

Stack Overflow用户
提问于 2020-09-13 04:01:41
回答 3查看 46关注 0票数 1

我想创建一个变量,用于标记多个变量中是否有一个或多个变量具有特定值。

代码语言:javascript
复制
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语句来分别检查每个变量?

代码语言:javascript
复制
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

我试过了

代码语言:javascript
复制
df %>%
  rowwise() %>%
  mutate(flag = +any(c_across(Mon, Weds, Sat)
  %in% ("jon", "mary")) %>%
  ungroup()

但是我得到了一个错误

代码语言:javascript
复制
Error: Problem with `mutate()` input `flag`.
x unused arguments (Mon, Weds, Sat)
i Input `flag` is `+...`.
i The error occurred in row 1.
EN

回答 3

Stack Overflow用户

发布于 2020-09-13 04:30:14

代码语言:javascript
复制
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

代码语言:javascript
复制
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请求):

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2020-09-13 06:14:01

如果我们使用mapreduce遍历列,我们可以使它更高效,而不是对行进行rowwise或循环

代码语言:javascript
复制
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    1

base R中对应的选项是lapply/Reduce

代码语言:javascript
复制
df$flag <- +(Reduce(`|`, lapply(df[c('Mon', 'Weds', 'Sat')],
          `%in%`, c("jon", "mary"))))

数据

代码语言:javascript
复制
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
))
票数 2
EN

Stack Overflow用户

发布于 2020-09-13 06:33:29

下面是使用rowSums + Reduce的另一个基本R选项

代码语言:javascript
复制
df$flag <- +(rowSums(
  Reduce(
    `+`,
    lapply(
      c("jon", "mary"),
      `==`,
      df[c("Mon", "Weds", "Sat")]
    )
  )
) > 0)

这样的话

代码语言:javascript
复制
  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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63864431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档