首页 > 解决方案 > 根据值列表有效地检查多个变量的值

问题描述

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

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

标签: rdataframeif-statement

解决方案


您可以使用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], `%in%`, more_values)))

推荐阅读