对此的简单回答是"购买更多内存",但我希望得到更具建设性的答案,并在此过程中学到一些东西.
我运行Windows 7 64位,内存为8GB.
我有几个非常大的.csv.gz文件(大约450MB未压缩),它们具有我读入R并执行一些处理的完全相同的标题信息.然后,我需要将处理过的R对象组合成一个主对象,并在磁盘上写回.csv.
我在多组文件上执行相同的操作.例如,我有5个文件夹,每个文件夹中包含6个csv.gz文件.我需要最终得到5个主文件,每个文件夹一个.
我的代码如下所示:
for( loop through folders ){
master.file = data.table()
for ( loop through files ) {
filename = list.files( ... )
file = as.data.table ( read.csv( gzfile( filename ), stringsAsFactors = F ))
gc()
...do some processing to file...
# append file to the running master.file
if ( nrow(master.file) == 0 ) {
master.file = file
} else {
master.file = rbindlist( list( master.file, file) )
}
rm( file, filename )
gc()
}
write.csv( …Run Code Online (Sandbox Code Playgroud) 我有一个约250个变量的数据框.不幸的是,所有这些变量都是从sql数据库中导入为字符类的sqldf.问题是:所有这些都不应该是字符类.有数字变量,整数,以及日期.我想构建一个运行在所有变量上的模型,为此我需要确保变量具有正确的类.一个接一个地做它可能是最好的,但仍然非常手动.
我怎么能自动纠正所有课程?也许是一种检测列中是否有字母字符或只有数字字符的方法?
我不认为自动方法可以完美地纠正所有课程.但它可能会纠正大多数类,然后是那些不好的类,我可以手动处理它们.
我正在添加一个sqldf标签,以防任何人在导入数据时知道如何纠正这个问题,但我认为这不是sqldf的错,而是数据库的错误.
我正在寻找一种从更大的表中提取大量行的快速方法.我的表顶部如下:
> head(dbsnp)
snp gene distance
rs5 rs5 KRIT1 1
rs6 rs6 CYP51A1 1
rs7 rs7 LOC401387 1
rs8 rs8 CDK6 1
rs9 rs9 CDK6 1
rs10 rs10 CDK6 1
Run Code Online (Sandbox Code Playgroud)
尺寸:
> dim(dbsnp)
[1] 11934948 3
Run Code Online (Sandbox Code Playgroud)
我想选择列表中包含rownames的行:
> head(features)
[1] "rs1367830" "rs5915027" "rs2060113" "rs1594503" "rs1116848" "rs1835693"
> length(features)
[1] 915635
Run Code Online (Sandbox Code Playgroud)
毫不奇怪,这样做的直接方式temptable = dbsnp[features,]需要相当长的时间.
我一直在研究如何通过R中的sqldf包来实现这一点.我认为这可能会更快.不幸的是,我无法弄清楚如何在SQL中选择具有某些rownames的行.
谢谢.
有没有办法从sqldf查询中调用R函数?例如
sqldf("select paste('Hello', 'World')")
Run Code Online (Sandbox Code Playgroud)
或者,有没有办法在sqldf后面的SQLite引擎中定义自定义函数或存储过程?(我使用sqldf和普通的内存中的R数据帧;我没有连接到任何实际的数据库.)
我正在阅读一个具有'%d/%m/%Y'日期格式的巨大文本文件.我想使用sqldf的read.csv.sql来按日期同时读取和过滤数据.这是为了节省内存使用和跳过许多日期,我不是有意的运行时间.我知道如何的帮助下做到这一点dplyr和lubridate,但我只是想尝试与sqldf通过前述的理由.尽管我对SQL语法非常熟悉,但它仍然在大部分时间里都是我,但也不例外sqldf.
像下面这样的运行命令返回了一个带有0行的data.frame:
first_date <- "2001-11-1"
second_date <- "2003-11-1"
query <- "select * from file WHERE strftime('%d/%m/%Y', Date, 'unixepoch', 'localtime') between
'$first_date' AND '$second_date'"
df <- read.csv.sql(data_file,
sql= query,
stringsAsFactors=FALSE,
sep = ";", header = TRUE)
Run Code Online (Sandbox Code Playgroud)
所以对于模拟,我尝试使用sqldf如下函数:
first_date <- "2001-11-1"
second_date <- "2003-11-1"
df2 <- data.frame( Date = paste(rep(1:3, each = 4), 11:12, 2001:2012, sep = "/"))
sqldf("SELECT * FROM df2 WHERE strftime('%d/%m/%Y', Date, 'unixepoch') BETWEEN '$first-date' AND '$second_date' …Run Code Online (Sandbox Code Playgroud) 我的问题涉及如何在将数据导入R时跳过文件开头的元数据.我的数据是.txt格式,其中第一行是描述数据的元数据,需要过滤掉这些数据.下面是制表符分隔格式的数据框的最小示例:
Type=GenePix Export
DateTime=2010/03/04 16:04:16
PixelSize=10
Wavelengths=635
ImageFiles=Not Saved
NormalizationMethod=None
NormalizationFactors=1
JpegImage=
StdDev=Type 1
FeatureType=Circular
Barcode=
BackgroundSubtraction=LocalFeature
ImageOrigin=150, 10
JpegOrigin=150, 2760
Creator=GenePix Pro 7.2.29.002
var1 var2 var3 var4 var5 var6 var7
1 1 1 molecule1 1F3 400 4020
1 2 1 molecule2 1B5 221 4020
1 3 1 molecule3 1H5 122 2110
1 4 1 molecule4 1D1 402 2110
1 5 1 molecule5 1F1 600 4020
Run Code Online (Sandbox Code Playgroud)
如果我知道实际数据的起始行,我可以使用下面显示的基本命令:
mydata <- read.table("mydata.txt",header=T, skip=15)
Run Code Online (Sandbox Code Playgroud)
哪个会回归;
mydata
var1 var2 var3 var4 var5 var6 var7 …Run Code Online (Sandbox Code Playgroud) 考虑以下data.table事件:
library(data.table)
breaks <- data.table(id = 1:8,
Channel = c("NP1", "NP1", "NP2", "NP2", "NP3", "NP3", "AT4", "AT4"),
Time = c(1000, 1100, 975, 1075, 1010, 1080, 1000, 1050),
Day = c(1, 1, 1, 1, 1, 1, 1, 1),
ZA = c(15, 12, 4, 2, 1, 2, 23, 18),
stringsAsFactors = F)
breaks
id Channel Time Day ZA
1: 1 NP1 1000 1 15
2: 2 NP1 1100 1 12
3: 3 NP2 975 1 4
4: 4 NP2 1075 1 2 …Run Code Online (Sandbox Code Playgroud) 我的数据框有一些变量,包含像字符串一样的缺失值"NA".解析包含这些列的数据帧中的所有列并将它们转换为由函数捕获的实际NA的最有效方法是什么is.na()?
我使用sqldf来查询数据库.
可重复的例子:
vect1 <- c("NA", "NA", "BANANA", "HELLO")
vect2 <- c("NA", 1, 5, "NA")
vect3 <- c(NA, NA, "NA", "NA")
df = data.frame(vect1,vect2,vect3)
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) 我刚刚更新了所有R套餐,包括sqldf今天.然后我不断收到如下警告信息:
Warning message:
Quoted identifiers should have class SQL, use DBI::SQL() if the caller performs the quoting.
Run Code Online (Sandbox Code Playgroud)
这里有什么问题?这个警告严重吗?怎么解决?
更新:
更新sqldf及其相关包后会发生这种情况.我使用的命令是sqldf("select * from something order by something")