如何使用 NSE 将列转换为不同的类型?

How to convert a column to a different type using NSE?

我正在编写一个函数,它将一个数据框和一个列名作为参数,并且 returns 带有指定列的数据框被转换为字符类型。然而,我卡在了dplyr的非标准评估部分。

我当前的代码:

df <- tibble(id = 1:5, value = 6:10)
col <- "id"
mutate(df, "{col}" := as.character({{ col }}))

# # A tibble: 5 x 2
#   id    value
#   <chr> <int>
# 1 id        6
# 2 id        7
# 3 id        8
# 4 id        9
# 5 id       10

如您所见,不是将列的内容转换为字符类型,而是将列值替换为列名。 {{ col }} 没有像我预期的那样被评估。我想要的是这样的动态等效项:

mutate(df, id = as.character(id))

# # A tibble: 5 x 2
# id    value
# <chr> <int>
# 1 1         6
# 2 2         7
# 3 3         8
# 4 4         9
# 5 5        10

我已尝试按照 dplyr 的编程插图中提供的说明进行操作,但我没有找到有效的解决方案。我做错了什么?

使用.data代词-

library(dplyr)

df <- tibble(id = 1:5, value = 6:10)
col <- "id"
mutate(df, "{col}" := as.character(.data[[col]]))

#  id    value
#  <chr> <int>
#1 1         6
#2 2         7
#3 3         8
#4 4         9
#5 5        10

其他一些选择-

mutate(df, "{col}" := as.character(get(col)))
mutate(df, "{col}" := as.character(!!sym(col)))

我们可以使用 across,它也可以在多个列上执行此操作

library(dplyr)
df %>%
    mutate(across(all_of(col), as.character))
# A tibble: 5 x 2
  id    value
  <chr> <int>
1 1         6
2 2         7
3 3         8
4 4         9
5 5        10

数据

df <- tibble(id = 1:5, value = 6:10)
col <- "id"