【问题标题】:Issue with R colClasses when trying to select certain columns from csv file尝试从 csv 文件中选择某些列时出现 R colClasses 问题
【发布时间】:2018-08-25 07:24:53
【问题描述】:

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

让我用 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 认为它是一个逻辑类型,而实际上它可能是很多其他类型。

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

【问题讨论】:

    标签: r csv


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多