在没有表头的文件上使用read.csv.sql时,如何定义列名?

wko9yo5t  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(104)

我经常使用read.csv函数读取大型CSV文件。这些文件没有标题,因此通过使用col.names参数,我可以正确定义导入后创建的 Dataframe 中的变量名称。
今天,我第一次不得不使用sqlf包中的read.csv.sql。要导入的文件非常大,我只需要根据该文件中的一个条件确定某些行。根据online documentation,过滤器必须在SELECT语句的WHERE子句中定义。(在其他列中),它是user_account,我只想导入满足条件user_account = 'Foo'的行。

df <- read.csv.sql(
    "my_big_data_file.csv",
    sql = "select * from file where user_account = 'Foo'",
    header = FALSE,
    colClasses = c(... Here I define column types ...),
    sep = "|",
    eol = "\n"
)

现在的问题是,与read.csv不同,read.csv.sql中显然没有col.names参数。由于我的文件没有头,我不知道如何引用列名。我收到一个错误消息,因为我在上面代码中sql参数的WHERE子句中写入了user_account。R抱怨没有这样的变量。
那么,我如何在没有标题的CSV文件中使用read.csv.sql引用列名,同时在过滤器中引用这些列名呢?这可能吗?
先谢了

luaexgnf

luaexgnf1#

最后,我在read.csv.sql的文档中找到了答案。我们必须使用fields.types来代替colClasses,方法是直接指定数据类型,因为它们是在SQLite中定义的,而不是在R中定义的。

字段.类型一个列表,其名称是列名称,其内容是列的SQLite类型(而不是R类名)。指定这些类型可以提高速度。除非速度非常重要,否则通常不使用此参数。

SQLite数据类型可用here
因此,我相应地修改了我的程序:

df_tmp <- read.csv.sql(
    file = input_file_path,
    sql = "
       select
           *
       from
           file
       where trim(lower(user_account)) = 'foo'",
    header = FALSE,
    sep = "|",
    eol = "\n",
    `field.types` = list(
        col1 = c("TEXT"),
        col2 = c("TEXT"),
        user_account = c("TEXT"),
        col4 = c("REAL"),
        col5 = c("REAL")
    ),
    dbname = tempfile(),
    drv = "SQLite"
)

然而,最后我不得不通过as.numeric显式地转换一个已经转换为字符的变量。但是程序通过一个明确的警告消息指出了这一点。所以最后,这个解决方案为我完成了这项工作。
我希望这可能会帮助那些遇到同样问题的人。

相关问题