- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 R 中有一个程序,我已经运行了大约一天,它只完成了大约 10%。缓慢的主要原因是必须制作数千个 sqldf(SELECT ...)
使用 R 包调用长度约为 100 万的数据集 sqldf
.我的选择语句目前采用以下形式:
sqldf(SELECT V1, V2, FROM mytable WHERE cast(start as real) <= sometime and cast(realized as real) > sometime)
sometime
只是一些代表 unix 时间戳的整数,start
和 realized
是 mytable
的列也充满了 unix 时间戳条目。然而,我另外知道的是 |realized - start| < 172800
总是,这是一个相当小的时期,因为数据集跨越一年多。我的想法是,我应该能够利用这个事实告诉 R 只从时间 +- 172800
检查数据帧。在每个电话中。
是包裹sqldf
用在这里不合适?我应该使用 data.frame
的传统 [,] 遍历吗? ?有没有一种简单的方法可以结合这个事实来加速程序?我的直觉是分解数据框,对向量进行排序,然后构建自己遍历和选择适当条目的自定义函数,但如果这是最好的方法,我正在寻求一些肯定。
最佳答案
首先,慢的部分可能是 cast(...)
,所以与其在每个查询中对每条记录执行两次,不如离开 start
和 realized
作为时间戳,并更改查询以适应它。
其次,data.table
选项仍然快了大约 100 倍(但是请参阅最后关于使用 sqldf
进行索引的部分) .
library(sqldf)
library(data.table)
N <- 1e6
# sqldf option
set.seed(1)
df <- data.frame(start=as.character(as.POSIXct("2000-01-01")+sample(0:1e6,N,replace=T)),
realized=as.character(as.POSIXct("2000-01-01")+sample(0:1e6,N,replace=T)),
V1=rnorm(N), V2=rpois(N,4))
sometime <- "2000-01-05 00:00:00"
query <- "SELECT V1, V2 FROM df WHERE start <= datetime('%s') and realized > datetime('%s')"
query <- sprintf(query,sometime,sometime)
system.time(result.sqldf <- sqldf(query))
# user system elapsed
# 12.17 0.03 12.23
# data.table option
set.seed(1)
DT <- data.table(start=as.POSIXct("2000-01-01")+sample(0:1e6,N,replace=T),
realized=as.POSIXct("2000-01-01")+sample(0:1e6,N,replace=T),
V1=rnorm(N), V2=rpois(N,4))
setkey(DT,start,realized)
system.time(result.dt <- DT[start<=as.POSIXct(sometime) & realized > as.POSIXct(sometime),list(V1,V2)])
# user system elapsed
# 0.15 0.00 0.15
请注意,这两个结果集的排序方式不同。
编辑 基于@G.Grothendieck(sqldf
包的作者)的以下评论。
这变成了一个非常好的包比较......
# code from G. Grothendieck comment
sqldf() # opens connection
sqldf("create index ix on df(start, realized)")
query <- fn$identity("SELECT V1, V2 FROM main.df WHERE start <= '$sometime' and realized > '$sometime'")
system.time(result.sqldf <- sqldf(query))
sqldf() # closes connection
# user system elapsed
# 1.28 0.00 1.28
因此,在这种情况下,创建索引的速度 sqldf
大约提高了 10 倍。索引创建很慢,但你只需要做一次。 data.table 中的“键”创建(对表进行物理排序)速度非常快,但在这种情况下并没有提高性能(大约只有 2 倍)。
使用 system.time()
进行基准测试有点冒险(1 个数据点),因此最好使用 microbenchmark(...)
。请注意,要使其正常工作,我们必须运行上面的代码并保持连接打开(例如,删除最后一次调用 sqldf()
。)
f.dt <- function() result.dt <- DT[start<=as.POSIXct(sometime) & realized > as.POSIXct(sometime),list(V1,V2)]
f.sqldf <- function() result.sqldf <- sqldf(query)
library(microbenchmark)
microbenchmark(f.dt(),f.sqldf())
# Unit: milliseconds
# expr min lq median uq max neval
# f.dt() 110.9715 184.0889 200.0634 265.648 833.4041 100
# f.sqldf() 916.8246 1232.6155 1271.6862 1318.049 1951.5074 100
所以我们可以看到,在这种情况下,使用键的data.table
比使用索引的sqldf
快大约6倍。实际时间将取决于结果集的大小,因此您可能需要比较这两个选项。
关于r - 在 R 中加速 sqldf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24642260/
我希望在 sqldf() 中运行以下 sql 语句: select columnA, "new_column_value" as columnB, "column.C" from mytable wh
我正在尝试使用描述的方法从非常大的 csv 文件中读取选择数据的有效方法 here通过@JD_Long。该方法依赖于同名库中的 sqldf() 函数。我遇到的问题是该函数返回一个空数据框,该数据框具有
我正在读取一个具有'%d/%m/%Y'日期格式的巨大文本文件。我想使用sqldf的read.csv.sql来同时读取和按日期过滤数据。这是为了通过跳过许多我不感兴趣的日期来节省内存使用量和运行时间。我
我需要使用日期字段连接 2 个表 > class(pagos$pseudo_1mes) [1] "Date" > class(pseudo_meses$pseudo_1mes) [1] "Date"
我正在尝试按工作日获取移动平均值,因为我正在使用 sql 查询。数据框是 和sqldf代码: ma_782 = sqldf("SELECT t1.Id_indicator,
我已经在我的系统上全新安装了 sqldf 包,但是每当我运行任何 sql 查询时,我都会得到 Error in rsqlite_send_query(conn@ptr, statement) :
SQLDF 新手在这里。 我有一个大约有 15,000 行和 1 列的数据框。 数据看起来像: cars autocar carsinfo whatisthat donnadrive car tele
我有以下数据框(df11 和 df22)我想使用“UserID=UserID”和日期差 % separate(DateTime, c("Date", "Time"), sep=" ") %>%
今天我发现了一个我无法解释的问题。这是众所周知的行为吗? 数据集: structure(list(Original.Unit = c("some unit", "some unit", "some u
是否可以在 sqldf 中使用 SQL Server 2008 DATEPART() 典型的 SQL 命令? 我正在浏览文档,但没有找到任何与之相关的内容,我不熟悉 SQLite,所以如果我应该那样去
我正在使用 sqldf加入多个表,但我无法保存 times使用 chron 设置的类包上一列。我用了method="name__class" sqldf 的参数函数并用类适本地命名我的列,但我的 ti
我花了一段时间才弄清楚这一点。所以,我是answering my own question . 您有一些 .csv,您想要加载它 fast ,您想使用sqldf包裹。您常用的代码会被一些烦人的字段所困
如何在 R 中使用 sqldf 将 LIKE 子句与内部联接一起使用? 代码: Name <- c("Jack","Jill","Romeo") Name <- as.data.frame(Name)
sqldf 有一个获取“X”行的限制选项。我们也可以使用 sqldf 做一个 'x%' 样本吗? 例如 > sqldf("select * from iris limit 3") Loading re
我正在使用 sqldf 库返回一个具有不同值的数据框,而且只有日期列的最大值。数据框看起来像这样 +------+----------+--------+-----------------+ | NA
这是对此处提供的有关使用 sqldf() 的答案的跟进。 https://stackoverflow.com/a/1820610 在我的特殊情况下,我有一个超过 1.1 亿行的制表符分隔文件。我想选择
这个问题在这里已经有了答案: Regarding sqldf package/regexp function [duplicate] (1 个回答) 关闭 6 年前。 我有以下 mySQL 查询:
我试图用 pandasql::sqldf 循环列表,但这个 sqldf 似乎没有捕获循环变量。以下是我的问题的程式化概述: import pandas as pd from pandasql impo
我在 Linux 上运行 R 版本 2.14.1。当我尝试使用 安装 sqldf 时 install.packages(sqldf, dependencies=TRUE) 我收到以下错误:(这些错误导
我的目标是采用 'matr',按列 c1 对其进行排序,并保持 unique(c1) where c2 = 1。例如,从这段代码... c1 = c("a",'a','a','b','b','b','
我是一名优秀的程序员,十分优秀!