【问题标题】:trying to read specific columns from multiple csv with fread and apply尝试使用 fread 从多个 csv 读取特定列并应用
【发布时间】:2018-07-07 04:45:08
【问题描述】:

情况就是这样,我有很多 csv 文件,比如说,20 个。它们中的每一个都有不同的列名。所以我为他们制作了一张地图。

map
#   variable location
#          A   1
#          B   1
#          C   2

我试图把它们都读一遍,所以我有一个这样的代码:

Table <- rbindlist(
           apply(map, 1, function(x) {
               fil <- paste0(x[2], ".csv")
               sel <- x[1]
               fread(file = fil,  select = sel)
         }

完成后,我得到一个包含 1 列所有数据的 data.table。如果我使用rbind,我会得到一个很大的所需元素矩阵,但无法转换为我需要的 data.table 形式。我怎样才能让它发生?请指教,谢谢。

【问题讨论】:

  • 您有名称为1.csv' 2.csv` 的文件吗? map 是函数的名称 rbindlist(lapply(seq_len(nrow(map)), function(i) fread(file = paste0(map[i, 2], ".csv"), select = map[i, 1]))) 假设“变量”列是 character
  • 是的,文件名没问题。我可以读取数据,但无法将其提取出来。
  • 请尝试评论中的代码
  • 或者另一个选项是Map(function(x, y) fread(file = x, select = y), paste0(map$location, ".csv"), map$variable)或者更简洁的rbindlist(Map(fread, file = paste0(map$location, ".csv"), select = map$variable))
  • 这可能是原因,因为使用applyfactor 被强制转换为整数值并且不起作用

标签: r data.table


【解决方案1】:

问题在于数据集“地图”中属于 factor 类的列。当我们使用apply 时,它被转换为matrix 并且factor 列被强制转换为integer 值,这会导致不匹配。一种选择是转换为character 类。这可以使用Map 更紧凑地完成

rbindlist(Map(fread, file = paste0(map$location, ".csv"),
                   select = as.character(map$variable)))

【讨论】:

    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2019-05-12
    • 2021-02-04
    • 2013-05-06
    相关资源
    最近更新 更多