- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对任何与 SQL 相关的东西都很陌生,但我觉得我正在尝试做的事情必须是可能的。我看过相关的问题,但他们似乎并没有试图做和我一样的事情。
我想写一个函数在 dbplyr 管道中使用,所以如果我以后需要它,我不必重复代码。
我意识到并非 R 中的所有函数都能很好地转换为 SQL,但在这种情况下,case_when()
做。当我使用裸代码时它工作正常,但我不知道如何将它包装在一个函数中。我写的函数被直接传递到 SQL 中,显然它不是 SQL 中存在的函数。
是否可以让 dbplyr 查看我的函数中的代码,并将其转换为 SQL?
library(pacman)
p_load(dplyr, dbplyr, RSQLite)
# Set up fake database
con <- DBI::dbConnect(RSQLite::SQLite(), dbname = ":memory:")
test = tibble(a = c("a", "b", "c"))
test
#> # A tibble: 3 x 1
#> a
#> <chr>
#> 1 a
#> 2 b
#> 3 c
copy_to(con, test)
test_db <- tbl(con, "test")
case_when()
明确在
test_db
工作正常。
test_db %>%
mutate(b = case_when(
a == "a" ~ "AAA",
TRUE ~ a
))
#> # Source: lazy query [?? x 2]
#> # Database: sqlite 3.30.1 [:memory:]
#> a b
#> <chr> <chr>
#> 1 a AAA
#> 2 b b
#> 3 c c
case_when()
成一个函数,所以我可以重用它。在
test
上直接运行时效果很好.
func_aaa <- function(x) {
case_when(
x == "a" ~ "AAA",
TRUE ~ x
)
}
# The function works fine on the regular dataframe
test %>%
mutate(b = func_aaa(a))
#> # A tibble: 3 x 2
#> a b
#> <chr> <chr>
#> 1 a AAA
#> 2 b b
#> 3 c c
test_db
.查看它生成的查询,很明显 dbplyr 只是将我的函数名直接传递到 SQL 中。
test_db %>%
mutate(b = func_aaa(a))
#> Error: no such function: func_aaa
test_db %>%
mutate(b = func_aaa(a)) %>%
show_query()
#> <SQL>
#> SELECT `a`, func_aaa(`a`) AS `b`
#> FROM `test`
最佳答案
可能有更简单的方法,但一种选择是使用一个对整个数据帧进行操作并返回整个数据帧的函数,而不是在 mutate 中运行该函数:
func_aaa2 = function(data, var, newvar, val, newval) {
data %>%
mutate({{newvar}} := case_when(
{{var}} == val ~ newval,
TRUE ~ {{var}}))
}
test_db %>%
func_aaa2(a, "b", "a", "aaa")
a b
<chr> <chr>
1 a aaa
2 b b
3 c c
test_db %>%
func_aaa2(a, "b", "a", "aaa") %>% show_query()
SELECT `a`, CASE
WHEN (`a` = 'a') THEN ('aaa')
WHEN (1) THEN (`a`)
END AS `b`
FROM `test`
关于r - 编写自定义 R 函数以在 dbplyr SQL 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61773954/
什么是 dbplyr相当于DBI::dbSendQuery(con, "DELETE FROM WHERE ")的动词组合. 我想要的不是从数据库中查询数据,而是从数据库中删除数据和更新表。 我想在
我已使用 DBI::dbGetQuery 将数据提取到 SQL Server 中的临时表中. 即使在实际查询(不是下面的播放查询)中,我select convert(date, date_value)
用户有一个大表(3+ 十亿行)。 为了加快接下来几个月的查询速度,必须在远程数据库上创建索引。 假设有一个名为 conn 的连接- 创建索引并使其在与数据库断开连接后仍然存在的最佳方法是什么。 例如。
这个问题在这里已经有了答案: Pass SQL functions in dplyr filter function on database (2 个回答) 26 天前关闭。 我通常使用 filter
我正在尝试使用 str_detect , str_replace , str_replace_all dbplyr 中的方法与 oracle作为 beckend 数据库,但似乎无法访问此方法。 这是错
假设我想创建一个函数,该函数可以使用用户传递的任何函数来改变列。我需要知道如何在该函数到达 dbplyr 解析器之前引用和取消引用该函数。让我们看一个例子,假设我有一个这样的函数: testFun
我正在尝试将本地数据帧从 R 复制到我的 db2 数据库。我有权写入表,并且我已验证连接正常。 我正在使用: copy_to(connection, data.frame, name = my_tab
我正在尝试将本地数据帧从 R 复制到我的 db2 数据库。我有权写入表,并且我已验证连接正常。 我正在使用: copy_to(connection, data.frame, name = my_tab
我正在使用 dbplyr 包中的 in_schema() 函数在 R 的 postgresql 数据库的命名模式中创建表。 这不是一段新代码,它曾经按预期工作 = 在模式“my_schema”中创建一
函数 dbplyr::in_schema() 无法连接到大写字母的表。 当我在 PostgreSQL 中创建表时。 CREATE TABLE public."OCLOC" ( cod_ocloc
我想使用 dbplyr/dplyr 创建组级聚合变量。这是命令的要点: q = tbl_copy %>% group_by(group_var) %>% mutate(x_agg = min(
我正在使用 dbplyr 处理数据库表 我有一个本地表,想将它与数据库中的一个大表(150m 行)连接起来 数据库PRODUCTION是只读的 # Set up the connection and
我有一个非常简单的问题会产生错误。例子将清除这个。 library(odbc) library(DBI) library(dplyr) library(dbplyr) con % group_by
我有一个关于如何在 dbplyr SQL 翻译中使用 eval(parse(text=...)) 的问题。以下代码完全按照我想要的方式使用 dplyr 使用 eval(parse(text=eval_
我有一个关于如何在 dbplyr SQL 翻译中使用 eval(parse(text=...)) 的问题。以下代码完全按照我想要的方式使用 dplyr 使用 eval(parse(text=eval_
我正在尝试通过平均将分钟级别的时间序列数据聚合到每小时级别。 为了做到这一点,我想计算一个小时列,其中包含读取发生的日期和时间。然后我可以做一个简单的 group_by summarise。例如,我的
我目前可以通过 beeline CLI 访问 Apache Hive 数据库。我们仍在与 IT 协商以在服务器上获取 R。在那之前,我想 (ab) 使用 R dbplyr 包在另一台机器上生成 SQL
dbplyr 非常方便,因为它将 dplyr 代码转换为 SQL。这非常有效,除非它没有。例如,我试图通过将字符串与列中的值部分匹配来对行进行子集化。除了 postgres 之外,似乎这还没有在 db
我连接到我们的数据库: con <- dbConnect(odbc::odbc(), "myHive") 我知道这是成功的,因为当我运行它时,在 RStudio 的右上角我可以看到我们所有的数据库和表
我正在写一个 Shiny 的仪表板。要加载数据,我正在使用相当于 mydata % tbl('table1') %>% filter(position %in% in.posi
我是一名优秀的程序员,十分优秀!