如果我理解正确,您有一堆 CSV 文件,每个文件中都有多个实验,以“实验 ...”模式命名。您现在想以一种有效的方式将这些“实验”中的每一个读入 R。
这是一个不那么漂亮(但也不那么难看)的函数,它可能会让你朝着正确的方向开始。
该函数的基本作用是读取 CSV,识别每个新实验开始的行号,获取实验的名称,然后执行循环以使用单独的数据框填充列表。不过,命名“R 友好”并不真正麻烦,而且我决定将输出保留在列表中,因为正如 Andrie 指出的那样,“R 有很好的工具来处理列表。”
read.funkyfile = function(funkyfile, expression, ...) {
temp = readLines(funkyfile)
temp.loc = grep(expression, temp)
temp.loc = c(temp.loc, length(temp)+1)
temp.nam = gsub("[[:punct:]]", "",
grep(expression, temp, value=TRUE))
temp.out = vector("list")
for (i in 1:length(temp.nam)) {
temp.out[[i]] = read.csv(textConnection(
temp[seq(from = temp.loc[i]+1,
to = temp.loc[i+1]-1)]),
...)
names(temp.out)[i] = temp.nam[i]
}
temp.out
}
这是一个示例 CSV 文件。将其复制并粘贴到文本编辑器中,并将其保存为当前工作目录中的“funkyfile1.csv”。(或者,从 Dropbox 中读取:http: //dl.dropbox.com/u/2556524/testing/funkyfile1.csv)
"Experiment Name: Here Be",,
1,2,3
4,5,6
7,8,9
"Experiment Name: The Dragons",,
10,11,12
13,14,15
16,17,18
这是第二个 CSV。同样,复制粘贴并将其保存为“funkyfile2.csv”在您当前的工作目录中。(或者,从 Dropbox 中读取:http: //dl.dropbox.com/u/2556524/testing/funkyfile2.csv)
"Promises: I vow to",,
"H1","H2","H3"
19,20,21
22,23,24
25,26,27
"Promises: Slay the dragon",,
"H1","H2","H3"
28,29,30
31,32,33
34,35,36
请注意,funkyfile1
没有列名,而funkyfile2
有。这就是...
函数中的参数的用途:指定header=TRUE
or header=FALSE
。此外,标识每组新数据的“表达式”是funkyfile2
.
现在,使用以下功能:
read.funkyfile("funkyfile1.csv", "Experiment", header=FALSE)
# read.funkyfile("http://dl.dropbox.com/u/2556524/testing/funkyfile1.csv",
# "Experiment", header=FALSE) # Uncomment to load remotely
# $`Experiment Name Here Be`
# V1 V2 V3
# 1 1 2 3
# 2 4 5 6
# 3 7 8 9
#
# $`Experiment Name The Dragons`
# V1 V2 V3
# 1 10 11 12
# 2 13 14 15
# 3 16 17 18
read.funkyfile("funkyfile2.csv", "Promises", header=TRUE)
# read.funkyfile("http://dl.dropbox.com/u/2556524/testing/funkyfile2.csv",
# "Experiment", header=TRUE) # Uncomment to load remotely
# $`Promises I vow to`
# H1 H2 H3
# 1 19 20 21
# 2 22 23 24
# 3 25 26 27
#
# $`Promises Slay the dragon`
# H1 H2 H3
# 1 28 29 30
# 2 31 32 33
# 3 34 35 36
去拿那些龙。
更新
如果你的数据都是相同的格式,你可以使用lapply
Andrie 提到的解决方案和这个函数。只需列出您要加载的 CSV,如下所示。请注意,所有文件都需要使用与当前编写函数的方式相同的“表达式”和其他参数....
temp = list("http://dl.dropbox.com/u/2556524/testing/funkyfile1.csv",
"http://dl.dropbox.com/u/2556524/testing/funkyfile3.csv")
lapply(temp, read.funkyfile, "Experiment", header=FALSE)