R.一次导入多个.csv文件,同时跳过前7行并从前7行提供新的列标识符信息
我正在尝试将9000.csv文件导入到R中以创建一个主文件,并且希望能够比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行获取一些信息了 我还尝试使用以下代码
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))