r - 尝试从 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 认为它是一个逻辑类型,而实际上它可能是很多其他类型。
有没有办法使这项工作?或者是否有一种不同的技术可以让我根据它们的名称加载某些列?
解决方案
找到另一个解决方案:使用fread(file, select = column_names)
from data.table
。您可以为参数指定列索引或名称以select
仅加载这些列。
推荐阅读
- javascript - 如何以角度复制div
- xcode - 无法安装 Firebase/InAppMessagingDisplay:它们需要更高的最低部署目标
- jquery - Bootstrap 的可折叠侧边栏 4+
- android - 为 SPP 连接创建虚拟蓝牙接口
- laravel - 需要在 URL 中的任务之后获取下一个任务
- typescript - 从json比较今天的日期和日期,然后显示名称
- python - 异步python requests.post()
- yolo - YOLO-Darknet 平均损失没有减少
- azure - 使用 azure cli 创建应用程序洞察
- python - 熊猫系列过滤