我想创建一个基于虚拟变量的分数,其中不同的组合加起来有一定的“严格性”。
set.seed(2)
df <- data.frame(id = 1:20,
a = rbinom(20, 1, 0.6),
b = rbinom(20, 1, 0.6),
c = rbinom(20, 1, 0.6),
d = rbinom(20, 1, 0.6),
e = rbinom(20, 1, 0.6))
看起来像是
id a b c d e
1 1 0 0 0 1
2 0 1 1 0 0
3 1 0 1 0 1
4 1 1 1 1 1
5 0 1 0 0 1
6 0 1 0 1 0
7 1 1 0 1 0
8 0 1 1 1 1
9 1 0 1 1 0
10 1 1 0 1 1
11 1 1 1 1 0
12 1 1 1 1 1
13 0 0 0 1 1
14 1 0 0 1 1
15 1 1 1 1 1
16 0 0 0 0 1
17 0 0 0 1 1
18 1 1 0 0 1
19 1 0 0 1 1
20 1 1 0 1 1
现在我尝试创建以下变量:
df <- df %>% mutate(stringency = case_when(a == 1 ~ 3,
a == 1 & b == 1 ~ 6,
a == 1 & c == 1 ~ 6,
a == 1 & b == 1 & c ~ 7,
a == 1 & d == 1 ~ 11,
a == 1 & e == 1 ~ 9,
a == 1 & b == 1 & d == 1 ~ 9,
a == 1 & b == 1 & e == 1 ~ 9,
TRUE ~ 0))
但是,这会产生只有第一个参数有效的结果(a == 1 ~ 3
)。
id a b c d e stringency
1 1 0 0 0 1 3
2 0 1 1 0 0 0
3 1 0 1 0 1 3
4 1 1 1 1 1 3
5 0 1 0 0 1 0
6 0 1 0 1 0 0
7 1 1 0 1 0 3
8 0 1 1 1 1 0
9 1 0 1 1 0 3
10 1 1 0 1 1 3
11 1 1 1 1 0 3
12 1 1 1 1 1 3
13 0 0 0 1 1 0
14 1 0 0 1 1 3
15 1 1 1 1 1 3
16 0 0 0 0 1 0
17 0 0 0 1 1 0
18 1 1 0 0 1 3
19 1 0 0 1 1 3
20 1 1 0 1 1 3
我想要的是它“建立起来”:如果你只有a,你得到3;如果你有a和B,你得到6;等等
有什么想法我可以做到这一点吗?非常感谢
1条答案
按热度按时间zf9nrax11#
你必须注意你的条件的顺序。如果第一次条件是
TRUE
,case_when
将停止,并且不会计算其余的。因此,你希望最复杂的条件在开始,a == 1
在结束。由reprex package(v2.0.1)于2023-04-05创建
但是正如你在第4行中看到的,结果是7,但是如果你改变条件的顺序,它也可能是所有其他值,所以你需要添加更多的条件来清楚。