首页 > 解决方案 > 如何在 case_when 中传递列名向量

问题描述

我正在使用incase_when来总结数据框。我有一个示例数据框,如下所示rowwisedplyr

structure(list(A = c(NA, 1, 0, 0, 0, 0, 0), B = c(NA, 0, 0, 1, 
0, 0, 0), C = c(NA, 1, 0, 0, 0, 0, 0), D = c(NA, 1, 0, 1, 0, 
0, 1), E = c(NA, 1, 0, 1, 0, 0, 1)), row.names = c(NA, -7L), class = "data.frame")

当我提到所有名称时,代码有效

df %>%                                         
  rowwise() %>%                                   
  mutate(New =  case_when(any(c(A,B,C,D,E) == 1)  ~ 1,
                       all(c(A,B,C,D,E) == 0 ) ~ 0
                       ))

我可以通过向量中的名称,例如cols <- colnames(df),然后在case_when

标签: rdplyr

解决方案


要回答您的问题,您可以cur_data()dplyr1.0.0 或c_across()

library(dplyr)

df %>%                                         
  rowwise() %>%                                   
  mutate(New  =  case_when(any(cur_data() == 1)  ~ 1,
                          all(cur_data() == 0 ) ~ 0))

#     A     B     C     D     E   New
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1    NA    NA    NA    NA    NA    NA
#2     1     0     1     1     1     1
#3     0     0     0     0     0     0
#4     0     1     0     1     1     1
#5     0     0     0     0     0     0
#6     0     0     0     0     0     0
#7     0     0     0     1     1     1

c_across()

df %>%                                         
  rowwise() %>%                                   
  mutate(New =  case_when(any(c_across()== 1)  ~ 1,
                          all(c_across()== 0 ) ~ 0))

但您也可以使用以下方法解决此问题rowSums

df %>%                                         
 mutate(New = case_when(rowSums(. == 1, na.rm = TRUE) > 0 ~ 1, 
                        rowSums(. == 0, na.rm = TRUE) == ncol(.) ~ 0))

推荐阅读