【问题标题】:Reading multiple txt files into data frames and merging them into one将多个txt文件读入数据框并合并为一个
【发布时间】:2020-01-15 20:55:34
【问题描述】:

我是 R 新手,我无法使用我找到的信息来完成这项工作。

我在一个文件夹中有许多 .txt 文件,每个文件都包含来自一个主题的数据。这些文件具有相同的列,但每个文件的行数不同。此外,列标题仅从第 9 行开始。我想要做的是

  1. 将 .txt 文件一次性导入 RStudio,同时跳过前 8 行,然后
  2. 将它们按列合并到一个数据帧中,这样最终的数据帧就是一个包含来自所有受试者的长格式数据的数据集。

我设法做到了 1(我认为)使用 easycsv 包和以下代码:

fread_folder(directory = "C:/Users/path/to/my/files",
             extension = "TXT",
             sep = "auto",
             nrows = -1L,
             header = "auto",
             na.strings = "NA",
             stringsAsFactors = FALSE,
             verbose=getOption("datatable.verbose"),
             skip = 8L,
             drop = NULL,
             colClasses = NULL,
             integer64=getOption("datatable.integer64"),# default:"integer64"
             dec = if (sep!=".") "." else ",",
             check.names = FALSE,
             encoding = "unknown",
             quote = "\"",
             strip.white = TRUE,
             fill = FALSE,
             blank.lines.skip = FALSE,
             key = NULL,
             Names=NULL,
             prefix=NULL,
             showProgress = interactive(),
             data.table=FALSE
)

这行得通,但是现在我的问题是数据框以我的文件很长的路径命名,并且显然在 txt 文件之后(虽然没有 7)。因此它们非常长且笨拙,并且包含它们可能不应该包含的字符,例如空格。

所以现在我在将数据框合并为一个时遇到了麻烦,因为我不知道除了给它们赋予的默认名称之外,我不知道如何引用数据框,或者如何重命名它们,或者导入数据框时如何指定数据框的命名方式。

【问题讨论】:

  • 如果能提供一些示例/示例数据,人们可以用来尝试帮助您,那就太好了。
  • 没有别的东西,我可能会从do.call(rbind, lapply(list.files(path=..., pattern=..., full.names=TRUE), read.csv, stringsAsFactors=FALSE))开始。

标签: r


【解决方案1】:

下面的代码查找目录中的文件,使用这些名称获取文件作为变量,然后使用 rbindlist 将表格组合成一个单表。希望有帮助。它假定目录中的每个 .csv 或 .txt 文件都已作为单独的 data.table 拉入当前环境。

for (x in (list.files(directory))) {

    # Remove the .txt extension from the filename to get the table name
    if (grepl(".txt",x)) {
        x = gsub(".txt","",x) 
    }

    thisTable <- get(x) # use "get" to pull in the string as a variable

    # now just combined into a single dataframe
    if (exists("combined")) {
        combined = rbindlist(list(combined,thisTable))
    } else {
        combined <- thisTable
    }
}

【讨论】:

  • 谢谢!我使用 data.table=TRUE 运行了我在初始帖子中发布的代码,然后运行了您建议的代码,但我不断收到此错误消息:“get(x) 中的错误:找不到对象'Participant 1_VP02_Analysis 2_video_20190827_181840_detailed'”。 “参与者 1_VP02 ... 是我文件夹中的文件之一。如果您对此有任何进一步的想法,我将不胜感激
【解决方案2】:

以下应该可以正常工作。但是,如果没有样本数据或更清楚地说明您想要什么,就很难确定这是否是您想要完成的目标。

#set working directory
setwd("C:/Users/path/to/my/files")

#read in all .txt files but skip the first 8 rows
Data.in <- lapply(list.files(pattern = "\\.txt$"),read.csv,header=T,skip=8)  

#combines all of the tables by column into one 
Data.in <- do.call(rbind,Data.in)

【讨论】:

  • 谢谢,这似乎可行 - 但是,代码似乎假设我的文件只有一列,但实际上是 12(由制表符/空格分隔)。所以前 8 行只是一个分析日志,然后第 9 行有列名,从第 10 行开始是数据。我尝试包含一个 sep 参数,但我只是得到“read.table 中的错误(file = file,header = header,sep = sep,quote = quote,:比列名更多的列”。
  • 代码假设您的文件是逗号分隔的,您可以将第二行编辑为以下内容(我尚未对此进行测试,因此可能我犯了一个小错误)Data.in &lt;- lapply(list.files(pattern = "\\.txt$"),read.table,sep="\t",header=T,skip=8) 那应该在制表符分隔的表格中阅读。如果您的数据是空格分隔的,您可以将"\t" 切换为" "
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多