【问题标题】:How to load multiple csv files with different numbers of columns into an R dataframe?如何将具有不同列数的多个 csv 文件加载到 R 数据框中?
【发布时间】:2023-01-18 23:57:31
【问题描述】:

我有很多 csv 文件,它们大部分相同,但有些文件的列数不同。我想加载命名列并忽略任何其他列。 (所有文件都有一个带有列名的标题行)

我希望我可以做这样的事情,这样当一个文件有一个名为“Temp”的列时,它就会被忽略,但我不知道把 myCols 放在哪里才能得到那个结果。

fileList <- dir("thedata")
myCols <- c('Time','Place')
df <- do.call(rbind, lapply(fileList, read.csv))

【问题讨论】:

  • 我建议阅读?data.table::fread() 的帮助文件。它有多种读取 csv 的选项(而且速度也非常快,默认情况下可以正确处理大多数 csv,无需任何高级设置)。对于绑定,我建议?data.table::rbindlist()
  • 我们可以用purrr::map_df(fileList, read.csv)

标签: r csv


【解决方案1】:

首先,我创建了一些示例数据框来制作类似于您的描述的列表。

# Example data frames
df1 <- data.frame(Time = runif(10, 0, 100), Place = letters[1:10])
df2 <- data.frame(Time = runif(10, 0, 100), Place = letters[1:10], Temp = runif(10, 0, 1))
df3 <- data.frame(Time = runif(10, 0, 100), Place = letters[11:20])

# List of data frames
df_l <- list(df1, df2, df3)

现在一个可能的解决方案

# Now you can select only the target columns using Map and column names
myCols <- c('Time','Place')
df_l <- Map(function(x){x[,names(x) %in% my_cols]}, df_l)

# now you can simply rbind the data frames (which now all have the same columns)
df <- do.call("rbind", df_l)

head(df)
       Time place
1  6.474527     a
2 78.747293     b
3  9.758012     c
4 79.765140     d
5  9.130967     e
6 34.237917     f

【讨论】:

    【解决方案2】:

    下载xsv (releases) 并将其放在您的路径中,然后如果 Filenames 是具有文件名的字符向量,则运行以下代码。结果中的文件列将包含每行最初来自的文件名。如果你不需要最后一行可以只是 rbindlist(L)。

    library(data.table)
    
    L <- lapply(paste("xsv select Time,Place", Filenames), fread)
    rbindlist(setNames(L, Filenames), idcol = "file") 
    

    【讨论】:

      【解决方案3】:

      不确定如何避免读取不需要的列,但是 plyr 包有一个非常有用的函数 rbind.fill,它将数据帧按行连接在一起,如果该列不可用则用缺失值填充。

      all_data <- Map(read.csv, fileList)
      df <- plyr::rbind.fill(all_data)
      

      然后你可以从 df 中删除你不想要的列。

      正如其他人所提到的,为了加快读取数据的速度,您可能需要使用 readr 中的 read_csvdata.table 中的 fread。因为它们都比read.csv快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 2019-02-16
        相关资源
        最近更新 更多