R.一次导入多个.csv文件,同时跳过前7行并从前7行提供新的列标识符信息

R.一次导入多个.csv文件,同时跳过前7行并从前7行提供新的列标识符信息,r,csv,import,lapply,skip,R,Csv,Import,Lapply,Skip,我正在尝试将9000.csv文件导入到R中以创建一个主文件,并且希望能够比 read.csv(file="filename',header=TRUE, sep="\t") 此外,我想跳过每个.csv中的前7行,因为它们包含有关.csv文件的信息,但在我从这些行中检索信息并将其作为新列添加到数据文件中之前,我不想跳过这些行,以便以后可以识别每个后续文件 我以前在导入单个.csv文件时使用了skip=7选项,没有问题,但我无法一次导入多个文件,更不用说先从前7行获取一些信息了 我还尝试使用以下代码

我正在尝试将9000.csv文件导入到R中以创建一个主文件,并且希望能够比

read.csv(file="filename',header=TRUE, sep="\t")
此外,我想跳过每个.csv中的前7行,因为它们包含有关.csv文件的信息,但在我从这些行中检索信息并将其作为新列添加到数据文件中之前,我不想跳过这些行,以便以后可以识别每个后续文件

我以前在导入单个.csv文件时使用了
skip=7
选项,没有问题,但我无法一次导入多个文件,更不用说先从前7行获取一些信息了

我还尝试使用以下代码从一个文件夹中读取许多.csv文件

temp = list.files(pattern="*.csv")
myfiles = lapply(temp, read.delim)
每个.csv都采用以下格式

我希望我的代码使它们看起来像这样

Time   Var1 Var2 Var3 Var4 Var5 From    To         Date       Athlete     Event Description
0:00.0  0    0    0    0    0   0:00.0  3:32:13.7  24May2014  John Smith  Round 10 v Team B
0:00.1  1    1    4    0    0   0:00.0  3:32:13.7  24May2014  John Smith  Round 10 v Team B
下一位运动员将以相同的格式添加到下面,以此类推


其他人是否有过类似的想法?如果有,您是如何做到的?

您想手动提取前7行,将其余的留给
read.delim
。您可以使用
textConnection
来实现这一点,它允许您将字符串传递给函数,如
read.table

    allLines = readLines(address)
    metaData = allLines[1:7]
    data = read.delim(textConnection(paste0(allLines[8:length(allLines)],
                                            collapse='\n')))
然后像平常一样解析元数据。
我将把所有这些放在一个函数中,该函数输出一个表和一个列表中的元数据。通过它,您可以拥有一个列表列表,然后可以合并。

这是一个非常暴力的方法,因为我没有使用任何聪明的正则表达式或任何东西,但是如果您说所有文件都是以这种方式构造的,那么以下方法可能会起作用:

我使用
readLines
获得如下输入:

# [[1]]
# [1] "Program 5.5.3"
# 
# [[2]]
# [1] "\"rawFileName"      "\"\"C:\\....\"\"\""
# 
# [[3]]
# [1] "From"      "0:00.0"    "To"        "3:32:13.7"
# 
# [[4]]
# [1] "Date"      "24May2014"
# 
# [[5]]
# [1] "Athlete"    "John Smith"
# 
# [[6]]
# [1] "EventDescription"  "Round 10 v Team B"
# 
# [[7]]
# [1] "Time Var1 Var2 Var3 Var4 Var5"
# 
# [[8]]
# [1] "0:00  0    0    0    0    0"
# 
# [[9]]
# [1] "0:01  1    1    4    0    0"
然后,通过选择适当的列表项和元素,生成一个简单的函数来处理数据:

f <- function(filepath) {

  dat <- readLines(con <- file(filepath), warn = FALSE)
  close(con)
  x <- strsplit(dat, ', |=')

  res <- read.table(text = do.call(rbind, x[7:9]), header = TRUE, 
                    stringsAsFactors = FALSE)
  res <- within(res, {
    'Event Description' <- x[[6]][2]
    Athlete <- x[[5]][2]
    Date <- x[[4]][2]
    To <- x[[3]][4]
    From <- x[[3]][2]
  })
  return(res)
}
现在,您可以对所有文件重复此过程并合并它们

## untested
do.call(rbind.data.frame, Map(f, all_file_paths))
f('~/desktop/tmp.csv')

# Time Var1 Var2 Var3 Var4 Var5   From        To      Date    Athlete   Event Description
# 1 0:00    0    0    0    0    0 0:00.0 3:32:13.7 24May2014 John Smith 1 Round 10 v Team B
# 2 0:01    1    1    4    0    0 0:00.0 3:32:13.7 24May2014 John Smith 2 Round 10 v Team B
## untested
do.call(rbind.data.frame, Map(f, all_file_paths))