比方说,我有多个变量衡量物质滥用即A1是alcohal使用, A2是bhang和A3是可卡因。我想生成变量afin如果三者中的任何一个是肯定的,表明参与药物滥用的。
有没有办法缩短代码,所以我不指定使用多个ifelse语句,如下所示?试图找到最好的方法来做到这一点,因为我有 10 多个变量可以合并为一个,而写作ifelse可能并不理想。
# Anymatch
library(tidyverse)
set.seed(2021)
mydata <- tibble(
a1 = factor(round(runif(20, 1, 3)),
labels = c("Yes", "No", "N/A")),
a2 = factor(round(runif(20, 1, 3)),
labels = c("Yes", "No", "N/A")),
a3 = factor(round(runif(20, 1, 3)),
labels = c("Yes", "No", "N/A")),
b1 = round(rnorm(20, 10, 2)))
mydata
mydata <- mydata %>%
mutate(afin = ifelse(a1 == "Yes"|a2=="Yes"|a3=="Yes", "Yes", "No"))
Run Code Online (Sandbox Code Playgroud)
我们也可以在没有 a 的情况下做到这一点ifelse。只需将逻辑列转换为数字索引并传递 avector来替换值
library(dplyr)
mydata %>%
mutate(afin = c("no", "yes")[1 + (rowSums(select(cur_data(),
starts_with('a')) == 'Yes') > 0)])
Run Code Online (Sandbox Code Playgroud)
-输出
# A tibble: 20 x 5
a1 a2 a3 b1 afin
<fct> <fct> <fct> <dbl> <chr>
1 No Yes Yes 6 yes
2 N/A N/A N/A 7 no
3 No No No 12 no
4 No No N/A 7 no
5 No No Yes 9 yes
6 No N/A N/A 7 no
7 No N/A N/A 7 no
8 No N/A Yes 7 yes
9 N/A N/A Yes 10 yes
10 N/A N/A N/A 11 no
11 Yes Yes No 10 yes
12 N/A N/A No 14 no
13 No N/A Yes 9 yes
14 No N/A No 14 no
15 N/A No No 10 no
16 No Yes Yes 8 yes
17 No N/A No 13 no
18 N/A Yes No 9 yes
19 N/A N/A N/A 11 no
20 No No N/A 11 no
Run Code Online (Sandbox Code Playgroud)
或使用 c_across
mydata %>%
rowwise %>%
mutate(afin = c("no", "yes")[1+
any(c_across(starts_with('a')) == "Yes")]) %>%
ungroup
Run Code Online (Sandbox Code Playgroud)
您可以使用rowSums-
library(dplyr)
mydata %>%
mutate(afin = ifelse(rowSums(select(., a1:a3) == 'Yes') > 0, 'yes', 'no'))
# a1 a2 a3 b1 afin
# <fct> <fct> <fct> <dbl> <chr>
# 1 No Yes Yes 6 yes
# 2 N/A N/A N/A 7 no
# 3 No No No 12 no
# 4 No No N/A 7 no
# 5 No No Yes 9 yes
# 6 No N/A N/A 7 no
# 7 No N/A N/A 7 no
# 8 No N/A Yes 7 yes
# 9 N/A N/A Yes 10 yes
#10 N/A N/A N/A 11 no
#11 Yes Yes No 10 yes
#12 N/A N/A No 14 no
#13 No N/A Yes 9 yes
#14 No N/A No 14 no
#15 N/A No No 10 no
#16 No Yes Yes 8 yes
#17 No N/A No 13 no
#18 N/A Yes No 9 yes
#19 N/A N/A N/A 11 no
#20 No No N/A 11 no
Run Code Online (Sandbox Code Playgroud)