r语言 - 使用$ sign提取列返回Null



下面的SQLite数据库是我正在开发的一个大型数据库的一个小副本。

library(RSQLite)
library(inborutils)
library(tibble)
library(dplyr)
library(dbplyr)
col1 <- c(1:20)
col2 <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", 
"L", "M", "N", "O", "P", "Q", "R", "S", "T")
col3 <- c(21:40)
database <- dbConnect(SQLite(), dbname = "testDB.sqlit")
table1 <- tibble(col1, col2, col3)
dbWriteTable(database, "testDBtable", table1)
bd <- tbl(database, "testDBtable")

我想提取一列并对值进行因式分解。我在提取过程中遇到了一个问题,要么是因为我遗漏了一些东西,要么是因为我没有理解整个过程。

下面的代码正在努力提取一列,但非常慢(当我在我的数据库上使用它,而不是在这个微小的副本上):-

>pull(bd, col2) 
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" 
"Q" "R" "S"
[20] "T"

而此代码返回Null: -

>bd$col2
NULL

知道为什么这个返回Null吗?

我想使用的代码如下:-

bd$col2 <- ordered(bd$col2, levels=lvl.100260, labels=lbl.100260)

,因为这段代码非常慢:-

bd %>% 
pull(col2) %>% 
ordered(
., 
levels = lvl.100260, 
labels = lbl.100260
)

特别是当必须运行大量相同的代码时。

您使用的包inborutils不在CRAN上。我没有使用它来运行你的代码,所以下面的结果可能与你的不匹配。

问题是bd没有一个叫做col2的元素:

> names(bd)
[1] "src" "ops"

它有类

[1] "tbl_SQLiteConnection" "tbl_dbi"              "tbl_sql"              "tbl_lazy"            
[5] "tbl"

所以它不是基于一个数据框架,它需要去数据库提取数据。我认为有可能覆盖$操作符,但我怀疑如果你这样做了,你会发现bd$col2pull(bd, col2)一样慢。

对于如何加速这个更普遍的问题,我认为没有简单的答案。为了提高速度,您可能希望使用真实的数据帧(或者更好的是矩阵),但是如果尝试一次转换整个数据库,听起来似乎会遇到内存限制。一般的建议是分析代码以找到瓶颈,并考虑如何改进它们。

最新更新