【发布时间】:2018-08-25 07:24:53
【问题描述】:
我有一个庞大的 csv 文件,但我在分析中只使用了其中的一小部分列。为了节省时间和内存空间,我只想加载必要的列。我尝试按照建议的here 使用read.csv 的colClasses 方法,但我无法使其工作。
让我用 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 认为它是一个逻辑类型,而实际上它可能是很多其他类型。
有没有办法让它工作?或者是否有一种不同的技术可以让我根据它们的名称加载某些列?
【问题讨论】: