【发布时间】:2016-07-10 23:04:13
【问题描述】:
我有 537 个 .txt 文件,我需要将它们导入到 R 中的列表或单独的数据框中。我不想附加任何数据,因为将所有内容分开至关重要。
我已经重命名了每个文件,所以文件名都是统一的。在每个文件中,都有一个包含许多杂项信息的标题部分。此标题部分为 12-16 行,具体取决于文件。对于数据,我有 5 到 7 列。数据都是制表符分隔的。列数在 5 到 9 列之间变化,并且列的顺序并不总是相同,因此我可以将列名与数据一起导入很重要(列名跨文件是统一的)。文件格式如下:
标题
标题
标题
标题...最多 16 行
((标题和列名之间的空格数不同))
日期(\t)时间(\t)dataCol1(\t)dataCol2(\t)dataCol3(\t)dataCol4
((列名和单位之间没有空行))
mm/dd/yyyy(\t)hh:mm:ss(\t)units(\t)units(\t)units(\t)units
((单元和数据之间有 1 个空行))
01/31/2016(\t)14:32:02(\t)14.9(\t)25.3(\t)15.8(\t)25.6
((数据最多重复 4000 行))
回顾一下我需要什么: 将所有文件导入单个数据框或数据框列表。 跳过标题信息到带有“日期”的行(并可能删除带有单位和空行的两行)给我留下一行列名和后面的数据。
这是我一直在编写的代码的粗略副本。这个想法是,在将所有文件导入 R 之后,确定每个文件中 1-2 列的最大值。然后,导出一个文件,每个文件有 1 行,2 列包含每个文件的 2 个最大值。
##list files and create list for data.frames
path <- list.files("Path",pattern = NULL, all.files=FALSE,full.names=TRUE)
files <- list()
##Null list for final data to be extracted to
results <- NULL
##add names to results list (using file name - extension
results$name <- substr(basename(path),1,nchar(basename(Path))-4)
##loop to read in data files and calculate max
for(i in 1:length(path){
##read files
files[[i]] <- read.delim(path[[i]],header = FALSE, sep = "\t", skip = 18
##will have to add code:
##"if columnx exists do this; if columny exists do this"
##convert 2 columns for calculation to numeric
x.x <- as.numeric(as.character(files$columnx))
x.y <- as.numeric(as.character(files$columny))
##will have to add code:
##"if column x exists, do this....if not, "NA"
##get max value for 2 specific columns
results$max.x <- max(files$columnx)
results$max.y <- max(files$columny)
}
##add results to data frame
max <- data.frame(results)
##export to .csv
write.csv(max,file="PATH")
我现在知道,我的代码只是将所有内容都跳过到数据中(max 直到文件的很晚才出现,所以跳过 1 或 2 行不会伤害我),并且它假设列在每个文件中的顺序相同。这是一种可怕的做法,在大约 5% 的数据点上给了我一些不好的结果,但我想正确地做到这一点。我主要关心的是以可用的格式将数据放入 R 中。然后,我可以添加其他计算和转换。我是 R 新手,经过 2 天的搜索,我还没有找到我需要的帮助已经发布到任何论坛。
【问题讨论】:
-
看起来你上面的方法已经走上了正轨。为了解决标题信息问题,这是我的方法(没有所有细节):读取前 20 行,标题
-
谢谢,Dave2e。 @TJGorrie 将您的回复添加到他的代码中,所以在你们两个之间,我比以前更接近了!
-
很高兴听到有进展。如果您遇到麻烦,请使用更新的代码和一些示例数据发布一个新问题以获得更多帮助。论坛喜欢看到起点和期望终点的样本。