gpt4 book ai didi

r - 理解 rlang : mutate with variable col name and variable column

转载 作者:行者123 更新时间:2023-12-04 11:15:46 24 4
gpt4 key购买 nike

我想定义一个函数,它接受一个 data.frame 和一个列名,并返回转换该列(例如小写)的 data.frame。当列名事先已知时,这很简单:

diamonds %>% mutate(cut = tolower(cut))

如何定义函数 foo,这样:

col <- "cut"
foo(diamonds, col)

有同样的行为吗? (不寻找基本的 R 或 data.table 答案,因为我想保留 dplyr 将其转换为延迟评估的 SQL 调用的能力)。

如果我只是想让我的函数使用:foo(diamonds, cut),我只需要 enquo!!

foo <- function(df, col){
x <- enquo(col)
mutate(df, !!x := tolower(!!x))
}

如果我想将列名放在引号中,foo(diamonds, "cut"),添加 ensym 就足够了:

foo <- function(df, col){
col <- ensym(col)
x <- enquo(col)
mutate(df, !!x := tolower(!!x))
}

但是当给定参数变量时,这会失败:

col <- "cut"
foo(diamonds, col)

Error in ~col : object 'col' not found

我缺少什么可以评估变量?

最佳答案

您还可以通过使用 mutate_at() 在这里完全避免 tidy eval。

library(tidyverse)

(x <- tibble(
num = 1:3,
month = month.abb[num]
))
#> # A tibble: 3 x 2
#> num month
#> <int> <chr>
#> 1 1 Jan
#> 2 2 Feb
#> 3 3 Mar

x %>%
mutate(month = tolower(month))
#> # A tibble: 3 x 2
#> num month
#> <int> <chr>
#> 1 1 jan
#> 2 2 feb
#> 3 3 mar

foo <- function(df, col) {
mutate_at(df, .vars = col, .funs = tolower)
}

foo(x, "month")
#> # A tibble: 3 x 2
#> num month
#> <int> <chr>
#> 1 1 jan
#> 2 2 feb
#> 3 3 mar

this <- "month"
foo(x, this)
#> # A tibble: 3 x 2
#> num month
#> <int> <chr>
#> 1 1 jan
#> 2 2 feb
#> 3 3 mar

reprex package 创建于 2019-03-09 (v0.2.1.9000)

关于r - 理解 rlang : mutate with variable col name and variable column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55083084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com