将字符视为列名
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
)?
我们可以使用across
和cur_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
我正在尝试将字符串视为 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
)?
我们可以使用across
和cur_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