应该使用哪种数据结构,可以以自定义方式附加?

时间:2013-04-09 15:25:51

标签: r

我必须从与多个实验相关的文件中加载数据,然后处理它们以生成绘图。每个实验都生成多个文件。与实验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

目前,我手动设置每个文件名,这需要花费大量时间。

2 个答案:

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

或者,如果您只想要一个包含来自给定experimentssuffixes列表的所有文件名的向量,则会合并它们:

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进行进一步处理。 llplyplyr包的一部分。它迭代一个列表(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)。