gpt4 book ai didi

r - 如何动态构建字符串并将其传递给 R 中 dplyr 的 mutate() 函数?

转载 作者:行者123 更新时间:2023-12-02 03:01:32 25 4
gpt4 key购买 nike

我之前问过类似的问题(Link)。给出的答案效果很好。然而,事实证明,它并不完全适用于我的用例。

请考虑以下最小工作示例:

library(RSQLite)
library(dplyr)
library(dbplyr)
library(DBI)
library(stringr)

con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")

copy_to(con, mtcars, "mtcars", temporary = FALSE)

db <- tbl(con, "mtcars") %>%
select(carb) %>%
distinct(carb) %>%
arrange(carb) %>%
mutate(Q1=1, Q2=2, Q3=3, Q4=4) %>%
collect()

我对动态构建字符串 Q1=1, Q2=2, Q3=3, Q4=4 感兴趣,这样它就可以是 Q1=1, Q2=2, 。 ..,Qn = n.

我的一个想法是构建这样的字符串:

n_par <- 4
str_c('Q', 1:n_par, ' = ', 1:n_par, collapse = ', ')

使得 n_par 可以是任何正数。然而,由于 dplyr 的非标准评估,我无法让它像那样工作。然而,这正是我所需要的。

有人可以帮忙吗?

最佳答案

生成并评估字符串

Q1 = 1, Q2 = 2, Q3 = 3, Q4 = 4 不是字符串,与 "Q1 = 1, Q2 = 2, Q3 = 3, Q4 = 4" 是一个字符串。有一些 R 函数会接受字符串对象并将其作为代码进行计算。例如:

> eval(parse(text="print('hello world')"))

#> [1] "hello world"

但是,这在 dbplyr 翻译中可能效果不佳。如果您设法让类似的方法发挥作用,那么很高兴看到它作为答案发布。

使用循环

另一种方法是使用循环,而不是作为单个字符串来执行:

db <- tbl(con, "mtcars") %>%
select(carb) %>%
distinct(carb) %>%
arrange(carb)

for(i in 1:n){
var = paste0("Q",i)
db <- db %>%
mutate(!!sym(var) := i)
}

db <- collect(db)

需要 !!sym() 来告诉 dplyr 您希望将文本参数视为变量。如果没有它,惰性求值会给你带来奇怪的结果。需要 := 赋值,因为需要评估 LHS。

这种方法大致相当于每个变量都有一个 mutate 语句(如下例),但是 dbplyr 翻译可能看起来不像在单个 mutate 语句中完成所有操作那么优雅。

db <- tbl(con, "mtcars") %>%
select(carb) %>%
distinct(carb) %>%
arrange(carb) %>%
mutate(Q1 = 1) %>%
mutate(Q2 = 2) %>%
...
mutate(Qn = n) %>%
collect()

关于r - 如何动态构建字符串并将其传递给 R 中 dplyr 的 mutate() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59860305/

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