如何使用 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"
我正在编写一个函数,它将一个数据框和一个列名作为参数,并且 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"