微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据值列表有效地检查多个变量的值

如何解决根据值列表有效地检查多个变量的值

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

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

解决方法

您可以使用rowSums

df$flag <- +(rowSums(df[-1] == 'jon' | df[-1] == 'mary') > 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    1

如果要比较的值更多,并且无法单独编写每个值,则可以使用以下任一方法。

more_values <- c('jon','mary')
df$flag <- apply(df[-1],1,function(x) as.integer(any(x %in% more_values)))
df$flag <- +as.integer(rowSums(sapply(df[-1],`%in%`,more_values)) > 0)
df$flag <- +(Reduce(`|`,lapply(df[-1],more_values)))
,

一种base解决方案:

df$flag <- +(colSums(apply(df[-1],c("jon","mary"))) > 0)

或者您可以使用c_across()中的dplyr

library(dplyr)

df %>%
  rowwise() %>%
  mutate(flag = +any(c_across(-week) %in% c("jon","mary"))) %>%
  ungroup()

他们两个都给:

#    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

数据

df <- structure(list(week = 1:3,Mon = c("jon","jane","mary"),Tues = c("jon",Weds = c("jon",Thurs = c("jon",Fri = c("mary",Sat = c("mary","jane")),class = "data.frame",row.names = c(NA,-3L))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。