阅读时,我发现读取大于内存的csv文件的最佳方法是read.csv.sql从包中使用sqldf.该函数将数据直接读入sqlite数据库,从而执行sql语句.
我注意到以下内容:似乎读入sqlite的数据存储在一个临时表中,因此为了使其可供以后使用,需要在sql语句中这样询问.
作为示例,以下代码将一些示例数据读入sqlite:
# generate sample data
sample_data <- data.frame(col1 = sample(letters, 100000, TRUE), col2 = rnorm(100000))
# save as csv
write.csv(sample_data, "sample_data.csv", row.names = FALSE)
# create a sample sqlite database
library(sqldf)
sqldf("attach sample_db as new")
# read the csv into the database and create a table with its content
read.csv.sql("sample_data.csv", sql = "create table data as select * from file",
dbname = "sample_db", header = T, row.names = F, sep = ",")
Run Code Online (Sandbox Code Playgroud)
然后可以使用访问数据sqldf("select …
如何在不更改格式的情况下重命名SQLDF中的日期字段?
请参阅下面的示例,其中我的重命名日期字段"dt"将日期转换为数字.我该如何避免这种情况,或将其转换回日期?
#Question for Stack Exchange
df <- data.frame (date = c("2014-12-01","2014-12-02","2014-12-03"),
acct = c(1,2,3))
df$date = as.Date(df$date)
library("sqldf")
sqldf('
select
date as dt,
date,
acct
from df ')
dt date acct
1 16405 2014-12-01 1
2 16406 2014-12-02 2
3 16407 2014-12-03 3
Run Code Online (Sandbox Code Playgroud) 我有一个datwe37列的数据框.我有兴趣将第23到35列中的整数值(1,2,99)转换为字符值('是','否','NA').
datwe$COL23 <- sqldf("SELECT CASE COL23 WHEN 1 THEN 'Yes'
WHEN 2 THEN 'No'
WHEN 99 THEN 'NA'
ELSE 'Name ittt'
END as newCol
FROM datwe")$newCol
Run Code Online (Sandbox Code Playgroud)
我一直在使用上面的sqldf语句分别转换每一列.我想知道是否有其他智能方法可以做到这一点,也许应用功能?
如果您需要任何可重现的数据来构建数据帧datwe,我将在此处添加它.谢谢.
编辑:示例 datwe
set.seed(12)
data.frame(replicate(37,sample(c(1,2,99),10,rep=TRUE)))
Run Code Online (Sandbox Code Playgroud) 我得到一个sqlite3.OperationalError:没有这样的表:Bills
我首先使用pandas调用我的数据帧,然后在我的查询中调用这些数据帧,这很好
import pandas as pd
from pandasql import sqldf
Bills = pd.read_csv("Bills.csv")
Accessorials = pd.read_csv("Accessorials.csv")
q = """
Select
CityStateLane,
Count(BillID) as BillsCount,
Sum(BilledAmount) as BillsSum,
Count(Distinct CarrierName) as NumberOfCarriers,
Avg(BilledAmount) as BillsAverage,
Avg(BilledWeight) as WeightAverage
From
Bills
Where
Direction = 'THIRD PARTY'
Group by
CityStateLane
Order by
BillsCount DESC
"""
topCityStateLane = sqldf(q)
Run Code Online (Sandbox Code Playgroud)
然后,我使用另一个查询创建另一个数据框,但这会调用错误,说Bills不存在,即使我在上一个查询中成功使用它.
q = """
SELECT
Bills.BillID as BillID,
A2.TotalAcc as TotalAcc
FROM
(SELECT
BillID_Value,
SUM(PaidAmount_Value) as "TotalAcc"
FROM
Accessorials
GROUP BY
BillID_Value
) AS A2, …Run Code Online (Sandbox Code Playgroud) 我试图基于多个条件上的两个data.frames的交集来填充二进制向量.
我有代码工作,但我觉得只是为了得到二进制矢量是内存过多.
当我将我的代码应用于我的完整数据(40毫米+行)时.我开始有记忆问题.
是否有更简单的方法来生成向量?
以下是一些样本数据(例如,子样本仅包括完整样本中的obs.):
ob1_1 <- as.data.frame(cbind(c(1999),c("111","222","666","777")),stringsAsFactors=FALSE)
ob2_1 <- as.data.frame(cbind(c(2000),c("111","333","555","777")),stringsAsFactors=FALSE)
ob3_1 <- as.data.frame(cbind(c(2001),c("111","222","333","777")),stringsAsFactors=FALSE)
ob4_1 <- as.data.frame(cbind(c(2002),c("111","444","555","777")),stringsAsFactors=FALSE)
full_sample <- rbind(ob1_1,ob2_1,ob3_1,ob4_1)
colnames(full_sample) <- c("yr","ID")
ob1_2 <- as.data.frame(cbind(c(1999),c("111","222","777")),stringsAsFactors=FALSE)
ob2_2 <- as.data.frame(cbind(c(2000),c("333")),stringsAsFactors=FALSE)
ob3_2 <- as.data.frame(cbind(c(2001),c("888")),stringsAsFactors=FALSE)
ob4_2 <- as.data.frame(cbind(c(2002),c("111","444","555","777")),stringsAsFactors=FALSE)
sub_sample <- rbind(ob1_2,ob2_2,ob3_2,ob4_2)
colnames(sub_sample) <- c("yr","ID")
Run Code Online (Sandbox Code Playgroud)
这是我的工作代码:
q_intersect <- ""
q_intersect <- paste(q_intersect , "select a.yr, a.ID ", sep=" ")
q_intersect <- paste(q_intersect , "from full_sample a ", sep=" ")
q_intersect <- paste(q_intersect , "intersect ", sep=" ")
q_intersect <- paste(q_intersect , "select b.yr, b.ID …Run Code Online (Sandbox Code Playgroud) 假设多年来动物园里每天都有动物活动的时间序列.非常大的数据集的子集可能如下所示:
library(data.table)
type <- c(rep('giraffe',90),rep('monkey',90),rep('anteater',90))
status <- as.factor(c(rep('display',31),rep('caged',28),rep('display',31),
rep('caged',25), rep('display',35),rep('caged',30),rep('caged',10),
rep('display',10),rep('caged',10),rep('display',60)))
date <- rep(seq.Date( as.Date("2001-01-01"), as.Date("2001-03-31"), "day" ),3)
Run Code Online (Sandbox Code Playgroud)
"类型"是动物类型,"状态"是动物当天所做事情的指示,例如,笼养或展示.
animals <- data.table(type,status,date);animals
type status date
1: giraffe display 2001-01-01
2: giraffe display 2001-01-02
3: giraffe display 2001-01-03
4: giraffe display 2001-01-04
5: giraffe display 2001-01-05
---
266: anteater display 2001-03-27
267: anteater display 2001-03-28
268: anteater display 2001-03-29
269: anteater display 2001-03-30
270: anteater display 2001-03-31
Run Code Online (Sandbox Code Playgroud)
假设我们想要将其汇总到月度系列中,该系列列出了动物的整个月状态信息.在新系列中,"状态"反映了该月初动物的状态."fullmonth"是一个二进制变量(1 = TRUE,0 = FALSE),表示此状态是否持续整个月,"anydisp"是否为二进制变量(1 = TRUE,0 = FALSE),表示动物是否开启在一个月内的任何时间显示(> = 1天).因此,因为长颈鹿在1月和3月的整个月展出,但在2月份被关在笼子里,因此得到了相应的标记.
date <- rep(seq.Date( …Run Code Online (Sandbox Code Playgroud) 我一直在尝试在 R 中使用 sqldf 包,但它只是在加载所需的包“proto”时停止。像这样:
库(sqldf)
加载所需的包:DBI
加载所需的包:gsubfn
加载所需的包:proto
我正在使用 R 版本 3.0.0 (2013-04-03)——“Masked Marvel”。有人可以让我知道这里缺少什么吗?多谢!
我正在使用RODBC软件包从R连接到Oracle数据库但是我没有成功地合并来自不同数据库的表而没有"下载"表格(我不想下载它们因为它们太大了!).我想使用类似的东西:
DBa=odbcConnect(dsn="DatabaseA",uid="uid",pwd="pwd",readOnly="True")
DBb=odbcConnect(dsn="DatabaseB",uid="uid",pwd="pwd",readOnly="True")
sqldf("select a.year, sum(b.var) as sumVar
from sqlFetch(DBa,'tableA') a
sqlFetch(DBb,'tableB') b
where a.ID=b.ID
group by a.year")
Run Code Online (Sandbox Code Playgroud)
如果有人有想法,那将非常有帮助!提前谢谢了.
莱昂内尔
我最近升级了R,RSQLite和sqldf(以下版本).
一般:
sqldf('create table foo as select * from bar', db = 'test.db')
Run Code Online (Sandbox Code Playgroud)
应该在附加的sqlite数据库中创建一个名为'foo'的表,如果存在加载新表,则使用数据框'bar'.
相反,我得到一个'没有这样的表'错误,而且当我查看数据库时,创建了'foo'和'bar'表.
可重复的例子:
library(RSQLite)
library(sqldf)
mydb = 'test.db'
## remove file if it exists
system(paste('rm', mydb))
## open connection
##con <- dbConnect(SQLite(), dbname=mydb)
system(paste('ls -l', mydb))
sqldf( paste0( 'attach "', mydb, '" as new' ) )
system(paste('ls -l', mydb))
class(mtcars)
sqldf( 'create table mycars as select * from mtcars', dbname = mydb )
sqldf('select * from sqlite_master', dbname = mydb)
sqldf('select * from main.mycars limit 1', dbname …Run Code Online (Sandbox Code Playgroud) 我在 r 中有一个包含近 2000 个变量的大型数据集。然后我使用 sqldf 编写一些 case 语句来在原始数据集上创建新列。但是我收到以下错误:
Error in rsqlite_send_query(conn@ptr, statement) : too many SQL variables
Run Code Online (Sandbox Code Playgroud)
我今天重新启动了我的笔记本电脑,以前这个错误从未发生过。
任何帮助表示赞赏。