将多个txt文件读入数据帧并将它们合并为一个

时间:2019-08-27 18:34:16

标签: r

似乎我有一个非常基本的问题,但是我对R真的很陌生,只是无法使其与我所找到的信息配合使用,所以我希望有人可以帮助我。

我在一个文件夹中有许多.txt文件,每个文件都包含一个主题的数据。这些文件具有相同的列,但是每个文件的行数有所不同。此外,列标题仅从第9行开始。我要做的是 1)一口气将.txt文件导入RStudio,同时跳过前8行,并且 2)通过它们的列将它们全部合并到一个数据帧中,以便最终的数据帧是一个数据集,其中包含来自所有主题的长格式数据。

我设法使用easycsv软件包和以下代码完成了1次操作:

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)。因此它们非常长且笨拙,并且包含了可能不应该包含的字符,例如空格。因此,现在我很难将数据帧合并为一个,因为我不知道除了已赋予它们的默认名称,如何重命名它们或如何指定之外,还如何引用这些数据帧。首先导入数据框时应如何命名。

如果有人可以帮助我解决这个问题,我将非常感激!

谢谢!

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

以下内容应该可以正常工作。但是,如果没有示例数据或更清晰地描述您想要的东西,很难确定这是否是您想要实现的目标。

#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)