【问题标题】:Create variable with conditions on other multiple variables在其他多个变量上创建具有条件的变量
【发布时间】:2026-02-07 08:25:01
【问题描述】:

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

例如,我有 5 个变量,ABCDE。它们的范围从 1 到 8。

我想创建新变量grade,条件如下。

1) 如果任何变量(AE)小于 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。

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

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

感谢您的帮助。

【问题讨论】:

    标签: r conditional-statements dplyr


    【解决方案1】:

    您可以使用通过remotes::install_github("tidyverse/dplyr") 安装的新版dplyr 和新版c_across 轻松获得所需内容。请注意,结果没有 3,因为我将您的逻辑解释为 &gt; 5 而不是 &gt;= 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
    

    【讨论】:

      最近更新 更多