4

我必须从与多个实验相关的文件中加载数据,然后处理它们以生成绘图。每个实验生成多个文件。与实验 1 相关的文件的名称为“Experiment1”,然后按其包含的数据类型添加后缀,即“Experiment1-per0”、“Experiment1-per50”、“Experiment1-per100”。

这些后缀对于所有实验都是固定的。所以要加载文件,我只想给出实验名称,然后在 R-script 中附加后缀。因此,对于我要给出的每个实验名称“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

目前,我手动输入每个文件名,这需要很多时间。

4

2 回答 2

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
  }
}

或者,如果您只想要给定experimentssuffixes列表中所有文件名的向量,这会将它们组合起来:

as.vector(sapply(experiments, paste, suffixes, sep="-"))
于 2013-04-09T15:46:27.173 回答
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进行进一步处理。llplyplyr包装的一部分。它遍历一个列表(第一个lin 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,然后您可以根据需要对其进行解析(例如,使用plyrand/or subset)。

于 2013-04-09T16:16:40.917 回答