我有一个庞大的csv文件,但在分析中只使用了其列的一小部分。为了节省时间和内存空间,我只想加载必要的列。我尝试按照建议的here使用colClasses
的{{1}}方法,但无法正常工作。
让我用MWE描述问题。假设我的数据(csv文件)是通过以下方式创建的:
read.csv
在csv中,列a保存为文本,而列b保存为数字。我只想加载列a进行分析。我的想法是仅使列类型形成colClasses向量。为此,我仅加载数据的第一行(速度很快,实际上我有1M +行),以检索列类型并创建要传递给df <- data.frame(a = c('3', '4'), b = c(5, 6))
write.csv(x = df, file = 'df.csv', row.names = F)
的向量:
colClasses
但是,当R通过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
(第一行)加载数据时,它仅在a列中看到整数并将其自动转换为整数类型。当我将此类型反馈到read.csv
参数中时,由于a作为字符串存储在csv中,因此它无法加载数据。我得到:
colClasses
另一个问题是,通过仅加载第一行数据来获取列类型,我可能没有给R提供足够的信息。如果某列的第一个元素为1,则看起来R认为它是逻辑类型,而实际上可能是很多其他类型。
有没有办法使这项工作有效?还是有其他技术可以使我根据其名称加载某些列?
答案 0 :(得分:0)
找到了另一个解决方案:使用fread(file, select = column_names)
中的data.table
。您可以为select
参数指定列索引或名称,以仅加载这些列。