我以前问过一个类似的问题(链接)。给出的答案很好。然而,事实证明,它并不完全适用于我的用例。
请考虑以下最低限度的工作实例:
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的非标准评估,我不能让它像那样工作。然而,这正是我所需要的。
有人能帮忙吗?
发布于 2020-02-17 15:45:49
我最近读到了更多关于这个主题的文章,我发现下面的代码工作得很好,因此dbplyr编写了一个更干净的SQL代码。
# Libraries
library(RSQLite)
library(dplyr)
library(dbplyr)
library(DBI)
# Example database
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")
copy_to(con, mtcars, "mtcars", temporary = FALSE)
# Parameter for number of variables to be created
n <- 4
# Variable list
var <- list()
for(i in 1:n){
j <- paste0("Q", i)
var[[j]] <- i
}
# Query/computation
db <- tbl(con, "mtcars") %>%
select(carb) %>%
distinct(carb) %>%
arrange(carb) %>%
mutate(!!! var) %>%
show_query() %>%
collect()诀窍是构建一个具有正确名称的列表,并使用!!!将其放入!!!函数中。此外,我读到应该避免解析和计算字符串,所以我切换到列表。
https://stackoverflow.com/questions/59860305
复制相似问题