r-将dplyr-vars()元素转换回字符



原始数据帧:

df <- data.frame(col1=c("A", "B"), col2=c("C", "D"), stringsAsFactors=F)
df
col1 col2
1    A    C
2    B    D

使用dplyrmutate_at,假设我想用列的名称替换列col2的所有值,以便获得:

df <- data.frame(col1=c("A", "B"), col2=c("col2", "col2"), stringsAsFactors=F)
df
col1 col2
1    A col2
2    B col2

例如,使用以下内容会触发错误:

df %>%
dplyr::mutate_at("col2", function(x){x=rlang::as_string(x)})

注意:这个例子的重点不是替换列col2的所有值,而是了解如何将vars(col2)向量转换回字符串"col2"

类似螺纹:R dplyr mutate_at访问colnames

dplyr::mutate_at中,不可能访问列名(只有它的值会在函数调用中使用(,但我们可以使用dplyr::across()dplyr::cur_column():

library(dplyr)
df <- data.frame(col1=c("A", "B"), col2=c("C", "D"), stringsAsFactors=F)
df %>% 
mutate(across(col2, ~ cur_column()))
#>   col1 col2
#> 1    A col2
#> 2    B col2

由reprex包(v0.3.0(于2021-01-11创建

我们可以编写一个简单的函数来代替across,该函数可以使用列的名称和值(包括tidyselect助手(:

library(tidyverse)
library(rlang)

create_vars <- function (.vars, .f)  {
data <- dplyr::cur_data()
vars <- rlang::enexpr(.vars)
cols <- tidyselect::eval_select(vars, data)
f <- rlang::as_function(.f)

cols <- dplyr::select(data, dplyr::all_of(names(cols)))
new_tibble(imap(cols, f), nrow = nrow(data))
}
df <- data.frame(col1=c("A", "B"), col2=c("C", "D"), stringsAsFactors=F)
df %>% mutate(create_vars(starts_with("col"), ~ paste(.y, .x)))
#>     col1   col2
#> 1 col1 A col2 C
#> 2 col1 B col2 D

由reprex包(v0.3.0(于2021-01-11创建

最新更新