如何解决根据值列表有效地检查多个变量的值
我想创建一个变量,以标记多个变量中的一个或多个是否具有特定值。
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 举报,一经查实,本站将立刻删除。