首页 > 解决方案 > 尝试从 csv 文件中选择某些列时出现 R colClasses 问题

问题描述

我有一个巨大的 csv 文件,但我在分析中只使用了它的一小部分列。为了节省时间和内存空间,我只想加载必要的列。我尝试使用这里建议的colClasses方法,但我无法使其工作。read.csv

让我用 MWE 来描述这个问题。假设我的数据(csv 文件)由以下内容创建:

df <- data.frame(a = c('3', '4'), b = c(5, 6))
write.csv(x = df, file = 'df.csv', row.names = F)

在 csv 中,a 列保存为文本,而 b 列保存为数字。我只想加载列 a 进行分析。我的想法是让列类型形成一个 colClasses 向量。为此,我只加载数据的第一行(速度很快,实际上我有 1M+ 行)检索列类型并创建一个要传递给的向量colClasses

df <- read.csv(file = 'df.csv', nrows = 1)  # read just first row
cols <- colnames(df)  # column names
coltypes <- sapply(df, class)  # column types
wanted_cols <- c('a')  # column names needed for analysis
cc <- rep('NULL', length(cols))  # initialize colClasses vector
cc[cols %in% wanted_cols] <- coltypes[cols %in% wanted_cols]  # put the needed types into cc
data <- read.csv(file = 'df.csv', colClasses = cc)  # load all rows but just needed columns

但是,当 R 通过(第一行)加载数据时,read.csv它只看到 a 列中的整数并自动将其转换为整数类型。当我将此类型反馈到colClasses参数中时,它无法加载数据,因为 a 在 csv 中存储为字符串。我得到:

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = 
dec,  : 
scan() expected 'a real', got '"3"'

另一个问题是,通过仅加载第一行数据来获取列类型,我可能无法为 R 提供足够的信息。如果某个列的第一个元素是 1,看起来 R 认为它是一个逻辑类型,而实际上它可能是很多其他类型。

有没有办法使这项工作?或者是否有一种不同的技术可以让我根据它们的名称加载某些列?

标签: rcsv

解决方案


找到另一个解决方案:使用fread(file, select = column_names)from data.table。您可以为参数指定列索引或名称以select仅加载这些列。


推荐阅读