将字符视为列名

Treat character as column name

我正在尝试将字符串视为 case_when 中的列名:

数据:

> df <- data.frame(col1 = c(NA, 1, 1, 0, 0),
                   col2 = c(NA, 1, 1, 0, 0),
                   col1_add=1:5, 
                   col2_add=c(6:9,NA))
> df
  col1 col2 col1_add col2_add
1   NA   NA        1        6
2    1    1        2        7
3    1    1        3        8
4    0    0        4        9
5    0    0        5       NA

尝试:

df %>% mutate_at(c("col1_add", "col2_add"), ~case_when(as.name(str_remove(., "_add"))==1 & .>3 ~ 0, TRUE ~ .))

如何将 str_remove(., "_add") 视为列名 (col1, col2)?

我们可以使用acrosscur_column()cur_column() - returns列名,其中str_remove用于删除子字符串“_add ",使用get获取对应列的值,应用case_when

中的逻辑
library(dplyr)
library(stringr)
df %>% 
  mutate(across(ends_with("_add"), 
   ~ case_when(get(str_remove(cur_column(), "_add")) == 1 & 
        .x >3 ~ 0L, TRUE ~ .x)))

-输出

  col1 col2 col1_add col2_add
1   NA   NA        1        6
2    1    1        2        0
3    1    1        3        0
4    0    0        4        9
5    0    0        5       NA

注意:以前可以从 mutate_at 获取带有 deparse/substitute 的列名,但现在在较新的 dplyr 版本中是不可能的。此外,_at/_all 已弃用,取而代之的是 across