我想要创建一个变量,它标志着一个或多个多个变量是否具有特定的值。
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发布于 2020-09-12 16:07:52
base解决方案:
df$flag <- +(colSums(apply(df[-1], 1, `%in%`, c("jon", "mary"))) > 0)或者您可以使用来自dplyr的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",
"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-12 16:04:27
您可以使用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)))https://stackoverflow.com/questions/63862212
复制相似问题