首页 > 解决方案 > 在其他多个变量上创建具有条件的变量

问题描述

我正在尝试创建具有其他多个变量条件的变量。

例如,我有 5 个变量,A, B, C, D, E。它们的范围从 1 到 8。

我想grade使用以下条件创建新变量 。

1) 如果任何变量 ( Ato E) 小于 2,则等级为 1

2) 如果所有变量都大于 3,并且任何变量在 3、4 之间,则评分为 2。

3) 如果所有变量都大于 5,则等级为 3。

test我任意创建数据集。

test<-data.frame(A=c(4,7,4,1,4),
                 B=c(8,8,6,5,8),
                 C=c(6,5,6,7,5),
                 D=c(7,8,7,5,8),
                 E=c(5,7,8,5,5))

test

在这种情况下,grade将是 2,3,2,1,2。

我尝试mutate_at了函数varsone_of函数。但是,它并没有返回我所期望的。

test<-test%>%mutate_at(
  vars(one_of("A","B","C","D","E")),
  funs(grade=case_when(. %in% c(1,2)~1,
                       min(.) %in% c(3,4)~2,
                       min(.) %in% c(5,6,7,8)~3)))

test

  A B C D E A_grade B_grade C_grade D_grade E_grade
1 4 8 6 7 5      NA       3       3       3       3
2 7 8 5 8 7      NA       3       3       3       3
3 4 6 6 7 8      NA       3       3       3       3
4 1 5 7 5 5       1       3       3       3       3
5 4 8 5 8 5      NA       3       3       3       3

感谢您的帮助。

标签: rconditional-statementsdplyr

解决方案


您可以使用新版本dplyr、安装方式remotes::install_github("tidyverse/dplyr")和新版本c_across轻松获得您想要的东西。请注意,结果没有 3 因为我将您的逻辑解释为> 5而不是>= 5.

library(dplyr)

test<-data.frame(A=c(4,7,4,1,4),
                 B=c(8,8,6,5,8),
                 C=c(6,5,6,7,5),
                 D=c(7,8,7,5,8),
                 E=c(5,7,8,5,5))

test %>%
  rowwise() %>%
  mutate(grade = case_when(
    sum(c_across(A:E) < 2) > 0 ~ 1,
    sum(c_across(A:E) > 5) == 5 ~ 3,
    TRUE ~ 2
  ))
#> # A tibble: 5 x 6
#> # Rowwise: 
#>       A     B     C     D     E grade
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1     4     8     6     7     5     2
#> 2     7     8     5     8     7     2
#> 3     4     6     6     7     8     2
#> 4     1     5     7     5     5     1
#> 5     4     8     5     8     5     2

推荐阅读