通过在 R 中组合 mutate 和 case_when 创建新变量

Lir*_*iri 2 r dplyr tidyverse

我有针对不同用户的应用程序交互数据集。应用交互保存为用户在特定周内与该功能交互的天数。示例表看起来像(出于实用目的注释掉 ID 和 weeknr):

tibble(
  #id     = (1, 1, 1), 
  #weeknr = (1, 2, 3), 
  var_1  = c(1, 2, 3, 2, 1),
  var_2  = c(0, 0, 1, 4, 0),
  var_3  = c(1, 1, 1, 0, 0)
)
Run Code Online (Sandbox Code Playgroud)

现在的目标是基于var_{1|3}. 如果应用交互计数 > 1,则分配 1,否则分配 0。我尝试了以下操作但没有成功:

tibble(
  var_1 = c(1, 2, 3, 2, 1),
  var_2 = c(0, 0, 1, 4, 0),
  var_3 = c(1, 1, 1, 0, 0)
) %>% 
  mutate_all(
    funs(case_when(
      . > 0 ~ 1, 
      . == 0 ~ 0, 
      TRUE ~ NA
    ))
  )
Run Code Online (Sandbox Code Playgroud)

任何帮助深表感谢!

ste*_*fan 5

利用dplyr::across你可以这样做:

library(dplyr)

tibble(
  var_1 = c(1, 2, 3, 2, 1),
  var_2 = c(0, 0, 1, 4, 0),
  var_3 = c(1, 1, 1, 0, 0)
) %>% 
  mutate(across(everything(), ~ case_when(
      .x > 0 ~ 1, 
      .x == 0 ~ 0, 
      TRUE ~ NA_real_
    ),
    .names = "{.col}_new")
  )
#> # A tibble: 5 × 6
#>   var_1 var_2 var_3 var_1_new var_2_new var_3_new
#>   <dbl> <dbl> <dbl>     <dbl>     <dbl>     <dbl>
#> 1     1     0     1         1         0         1
#> 2     2     0     1         1         0         1
#> 3     3     1     1         1         1         1
#> 4     2     4     0         1         1         0
#> 5     1     0     0         1         0         0
Run Code Online (Sandbox Code Playgroud)