【发布时间】:2021-02-05 21:32:29
【问题描述】:
我开了一个issue for this。但如果这是操作员错误而不是包的问题,我会在这里发布编码建议。
dbplyr 的最新 (v2.1) 更新应该增加对 across 和相关功能的支持。但是,当我尝试使用它时,仍然会出现错误。
我应该使用不同的语法吗?有解决办法吗?
library(dplyr, warn.conflicts = FALSE)
library(bigrquery)
set.seed(02042021)
Sys.setenv(BIGQUERY_TEST_PROJECT = "elite-magpie-257717")
bq_deauth()
bq_auth(email="ariel.balter@gmail.com")
conn = DBI::dbConnect(
bigrquery::bigquery(),
project = bq_test_project(),
dataset = "test_dataset"
)
my_table = data.frame(
A = replicate(10, paste(sample(letters[1:3], 3, replace=T), collapse="")),
B = replicate(10, paste(sample(letters[1:3], 3, replace=T), collapse="")),
C = replicate(10, paste(sample(letters[1:3], 3, replace=T), collapse="")),
D = runif(10)
)
my_table
#> A B C D
#> 1 bcb cbb bbb 0.3620390
#> 2 aac aac bba 0.5505868
#> 3 aca abb bcb 0.4028455
#> 4 bca baa bbb 0.3247477
#> 5 bcc cac ccc 0.6861223
#> 6 cac bba baa 0.6970764
#> 7 bcb bbc acc 0.6873332
#> 8 bca acb acb 0.5391651
#> 9 cba ccc abc 0.9442450
#> 10 cca cbc bcc 0.6319561
my_table %>%
mutate(
has_ab = if_any(everything(), ~grepl("ab", .))
)
#> A B C D has_ab
#> 1 bcb cbb bbb 0.3620390 FALSE
#> 2 aac aac bba 0.5505868 FALSE
#> 3 aca abb bcb 0.4028455 TRUE
#> 4 bca baa bbb 0.3247477 FALSE
#> 5 bcc cac ccc 0.6861223 FALSE
#> 6 cac bba baa 0.6970764 FALSE
#> 7 bcb bbc acc 0.6873332 FALSE
#> 8 bca acb acb 0.5391651 FALSE
#> 9 cba ccc abc 0.9442450 TRUE
#> 10 cca cbc bcc 0.6319561 FALSE
my_table %>%
mutate(
has_ab = if_any(where(is.numeric), ~grepl("ab", .))
)
#> A B C D has_ab
#> 1 bcb cbb bbb 0.3620390 FALSE
#> 2 aac aac bba 0.5505868 FALSE
#> 3 aca abb bcb 0.4028455 FALSE
#> 4 bca baa bbb 0.3247477 FALSE
#> 5 bcc cac ccc 0.6861223 FALSE
#> 6 cac bba baa 0.6970764 FALSE
#> 7 bcb bbc acc 0.6873332 FALSE
#> 8 bca acb acb 0.5391651 FALSE
#> 9 cba ccc abc 0.9442450 FALSE
#> 10 cca cbc bcc 0.6319561 FALSE
dbRemoveTable(
conn=conn,
name="test_dataset.mytable",
value=my_table,
overwrite=T
)
dbWriteTable(
conn=conn,
name="test_dataset.mytable",
value=my_table,
overwrite=T
)
my_table_bq = tbl(conn, "mytable")
my_table_bq %>%
mutate(
has_ab = if_any(everything(), ~grepl("ab", .))
)
#> Error in UseMethod("escape"): no applicable method for 'escape' applied to an object of class "formula"
my_table_bq %>%
mutate(
has_ab = if_any(where(is.numeric), ~grepl("ab", .))
)
#> Error in UseMethod("escape"): no applicable method for 'escape' applied to an object of class "function"
由reprex package (v1.0.0) 于 2021-02-05 创建
【问题讨论】:
-
我试过没有公式,只是赋值
TRUE/FALSE- 它说Function not found: if_any at [1:28] [invalidQuery] -
另外,我认为 Bigquery 的更多问题是不支持这些功能 - 所以最好在 R 中操作它并放回 BigQuery - 在数据库中执行这些操作有什么好处?
-
@SinhNguyen -- 据我所知,这本身并不是一个大查询问题。 Hadley 仍在努力改进 dbplyr 中对
across的支持,我认为这会更进一步。在数据库中工作的原因是文件太大而无法在本地处理(10 GB)。事实上,这就是dbplyr的魅力! -
顺便说一句,我只是使用本地 RSQLite 数据库而不是 BigQuery 运行相同的代码,以确保这绝对不是 BQ 问题。
-
如果你在 BQ 中编写查询 - 什么相当于 R 中的操作?