R:使用mutate和case_when将变量中的得分相加

wn9m85ua  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(108)

我想创建一个基于虚拟变量的分数,其中不同的组合加起来有一定的“严格性”。

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;等等
有什么想法我可以做到这一点吗?非常感谢

zf9nrax1

zf9nrax11#

你必须注意你的条件的顺序。如果第一次条件是TRUEcase_when将停止,并且不会计算其余的。因此,你希望最复杂的条件在开始,a == 1在结束。

library(dplyr)

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))

df <- df %>% mutate(stringency = case_when(a == 1 & b == 1 & c == 1 ~ 7,
                                           a == 1 & b == 1 & d == 1 ~ 9,
                                           a == 1 & b == 1 & e == 1 ~ 9,
                                           a == 1 & d == 1 ~ 11,
                                           a == 1 & e == 1 ~ 9,
                                           a == 1 & b == 1 ~ 6,
                                           a == 1 & c == 1 ~ 6,
                                           a == 1 ~ 3,
                                           TRUE ~ 0))

df
#>    id a b c d e stringency
#> 1   1 1 0 0 0 1          9
#> 2   2 0 1 1 0 0          0
#> 3   3 1 0 1 0 1          9
#> 4   4 1 1 1 1 1          7
#> 5   5 0 1 0 0 1          0
#> 6   6 0 1 0 1 0          0
#> 7   7 1 1 0 1 0          9
#> 8   8 0 1 1 1 1          0
#> 9   9 1 0 1 1 0         11
#> 10 10 1 1 0 1 1          9
#> 11 11 1 1 1 1 0          7
#> 12 12 1 1 1 1 1          7
#> 13 13 0 0 0 1 1          0
#> 14 14 1 0 0 1 1         11
#> 15 15 1 1 1 1 1          7
#> 16 16 0 0 0 0 1          0
#> 17 17 0 0 0 1 1          0
#> 18 18 1 1 0 0 1          9
#> 19 19 1 0 0 1 1         11
#> 20 20 1 1 0 1 1          9

reprex package(v2.0.1)于2023-04-05创建
但是正如你在第4行中看到的,结果是7,但是如果你改变条件的顺序,它也可能是所有其他值,所以你需要添加更多的条件来清楚。

相关问题