我必须从与多个实验相关的文件中加载数据,然后处理它们以生成绘图。每个实验都生成多个文件。与实验1相关的文件将具有其名称“Experiment1”,然后由其包含的数据类型后缀,即“Experiment1-per0”,“Experiment1-per50”,“Experiment1-per100”。
这些后缀对于所有实验都是固定的。所以要加载文件,我只想给出实验名称,后者在R脚本中附加后缀。因此,对于我将给出的每个实验名称“ExperimentX”,我将通过附加后缀来加载三个单独的数据文件(即“ExperimentX-per0”,“ExperimentX-per50”,“ExperimentX-per100”)
我无法弄清楚,我应该在哪个数据结构中存储初始实验名称,然后存储后缀名称。
样本文件(Experiment1-per50):
# the last column also shows the type of data i.e postfix of file
Obj TGiven TUsed TOGiven TOServed per50
16570 8 7 12 6 per50
18430 8 8 12 9 per50
16890 8 7 12 9 per50
目前,我手动设置每个文件名,这需要花费大量时间。
答案 0 :(得分:2)
如果每个实验都有相同的后缀集,则可以分别存储实验名称和后缀名称列表。然后,使用嵌套循环,您可以使用paste
函数组合实验名称和后缀名称以获取文件名。
您的代码可能如下所示:
experiments = c("Experiment1","Experiment2","Experiment3")
suffixes = c("per0","per50","per100")
for (experiment in experiments) {
for (suffix in suffixes) {
filename <- paste(experiment, suffix, sep="-")
df <- read.table(filename)
df$experiment <- experiment
# Do something with the dataframe here
}
}
或者,如果您只想要一个包含来自给定experiments
和suffixes
列表的所有文件名的向量,则会合并它们:
as.vector(sapply(experiments, paste, suffixes, sep="-"))
答案 1 :(得分:1)
如果实验之间的列不同,我会将实验包装在列表中,如下所示:
library(plyr);
experiments <- c("Experiment1","Experiment2","Experiment3");
suffixes <- c("per0","per50","per100");
# if you want to go ahead and get the data
data <- llply( experiments, function(experiment) {
llply( suffixes, function(suffix) {
fn <- str_c(experiment,'_',suffix,'.csv'); # make filename
# later, try to read fn, now just return
return(fn);
})
})
然后,您可以遍历data
进行进一步处理。 llply
是plyr
包的一部分。它迭代一个列表(l
中的第一个llply
)并返回一个列表(第二个l
)。
library(plyr);
experiments <- c("Experiment1","Experiment2","Experiment3");
suffixes <- c("per0","per50","per100");
data <- ldply( experiments, function(experiment) {
ldply( suffixes, function(suffix) {
data.frame(
experiment = experiment,
suffix= suffix,
fn = str_c(exper.name,'_',suffix,'.csv'))
})
})
这会将所有数据作为单个data.frame
读取,然后您可以根据需要进行解析(例如,使用plyr
和/或subset
)。