【问题标题】:selecting every Nth column in using SQLDF or read.csv.sql使用 SQLDF 或 read.csv.sql 选择每第 N 列
【发布时间】:2013-10-31 22:17:08
【问题描述】:

我对使用 SQL 语句比较陌生,并且在使用它们从大表中选择所需的列并将它们拉入 R 时遇到了一些麻烦。

我想获取一个 csv 文件并将选定的列读入 r,特别是每 9 和 10 列。在 R 中,类似:

read.csv.sql("myfile.csv", sql(select * from file [EVERY 9th and 10th COLUMN])

我对互联网的搜索表明,可以使用类似这样的 MOD 的 SQL 语句来选择每第 n 行(如果我错了,请纠正我):

"SELECT *
        FROM   file
        WHERE  (ROWID,0) IN (SELECT ROWID, MOD(ROWNUM,9) OR MOD(ROWNUM,10)"

有没有办法让这对列起作用?提前致谢。

【问题讨论】:

  • 您使用的是哪个 RDBMS?您的标题是第 n 列,而您的问题是第 n 行 - 它是哪一行?
  • @PreetSangha 使用 sqldf 它应该使用 SQLite 作为后端。
  • 谢谢,我不知道。
  • 抱歉给您带来了困惑,这是我感兴趣的专栏。我已经编辑了原帖。 Joran 是对的,是 SQLite
  • sqldf 默认使用 sqlite,也适用于 h2、mysql 和 postgresql。

标签: sql r sqldf


【解决方案1】:

read.csv read.csv 就足够了:

# determine number of columns
DF1 <- read.csv(myfile, nrows = 1)
nc <- ncol(DF1)

# create a list nc long where unwanted columns are NULL and wanted are NA
colClasses <- rep(rep(list("NULL", NA), c(8, 2)), length = nc)

# read in
DF <- read.csv(myfile, colClasses = colClasses)

sqldf 要使用 sqldf,请将最后一行替换为:

nms <- names(DF1)
vars <- toString(nms[is.na(colClasses)])
DF <- fn$read.csv.sql(myfile, "select $vars from file")

更新:切换到 read.csv.sql

更新 2:更正。

【讨论】:

  • 非常感谢! read.csv 方法非常适用于小型测试文件,但我很犹豫是否在我的 251 MB 文件上使用它,read.csv 之前对我可怜的 32 位 R 和大文件造成了严重破坏。 colClasses 修改是否会显着减少操作数量?对于 sqldf 函数,我对语法有点不熟悉..如何在 fn$sqldf 中指定我的文件? .csv 文件是否必须预加载到数据库中?如果我要使用 read.csv.sql 来保存一个步骤,你是否可以保持相同的 SQL 语法?即 read.csv.sql(myfile, sql="select $vars from file"
  • 已切换到 read.csv.sql。您可能还需要对 read.csv.sql 使用其他参数,具体取决于文件的精确格式。请参阅 ?read.csv.sql 。在性能方面,我认为您确实必须在数据上进行尝试才能感受它。比如说,用 1 MB 的行子集试试。
  • read.csv.sql 方法给了我以下错误:“sqliteExecStatement 中的错误(con,statement,bind.data):RS-DBI 驱动程序:(语句中的错误:接近“.1” :语法错误)”。这看起来是不是很眼熟?当 SQL 语句被停止时,它工作正常(不删除列),并且 colClasses 在 read.csv 方法上工作,所以它似乎是 sql 语句的语法将其丢弃。有任何想法吗?再次感谢您的帮助,非常感谢。
  • 其他参数似乎都不相关,但如果它有帮助的话,我的数据都是数字或单个字符。
  • 使用这些数据cat("a,b,c,d,e,f,g,h,i,j,k,l\n1,a,b,4,5,6,7,8,a,10,11,12\n", file = "test.dat"); myfile &lt;- "test.dat" 对我来说一切正常,所以代码没有根本性的问题。您需要以最小的可复制形式提供它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2022-12-12
  • 1970-01-01
  • 2018-10-07
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多