2

我对 R 很陌生,如果编程看起来很糟糕,我很抱歉。

目标是基于公共前缀创建文件名,即给定前缀循环 x 次以生成前缀 1、前缀 2、前缀 3。然后使用这些文件名读取.csv(prefix-1,prefix-2,prefix-3)。

我已经让代码工作了,但效率很低:

name <- vector(mode="character", length=0)
for (i in 1:numruns)name[i] <- paste(prefix, "-", i, ".log", sep="")

if (numruns == 1) {
        raw_data_1 <-read.csv(name[1], header=F, sep="\t", skip=11)
}

if (numruns == 2) {
        raw_data_1 <-read.csv(name[1], header=F, sep="\t", skip=11)
        raw_data_2 <-read.csv(name[2], header=F, sep="\t", skip=11)
}

if (numruns == 3) {
        raw_data_1 <-read.csv(name[1], header=F, sep="\t", skip=11)
        raw_data_2 <-read.csv(name[2], header=F, sep="\t", skip=11)
        raw_data_3 <-read.csv(name[3], header=F, sep="\t", skip=11)     #import files
}

我正在尝试学习如何提高效率,上述工作符合我的目的,但我觉得我应该能够将它包装在产生名称的初始循环中。当我尝试修改原始循环时,我无法让它工作......

for (i in 1:numruns){
        name[i] <- paste(prefix, "-", i, ".log", sep="")
        raw_data <- paste("raw_data_", i, sep="")
        print(raw_data)
        raw_data <- read.csv(name[i], header=F, sep="\t", skip=11)
}

而不是得到 raw_data_1,raw_data_2,raw_data_3... 我得到“raw_data”。我很困惑,因为 print(raw_data) 实际上正确打印了“raw_data_1-3”(但只有“raw_data”实际上包含任何信息)。

感谢您对我的代码的任何帮助或批评,以使其更高效。

4

2 回答 2

4

您应该尽早开始使用本机矢量化。一开始可能会令人困惑,但最终你会看到它的所有力量和美丽。请注意,许多基本函数都是矢量化的,因此对参数进行循环通常是多余的(参见paste下面的用法)。了解有关apply家庭的更多信息,它从一开始就是必不可少的工具(请参阅lapply电话)。

由于读取多个文件是一项常见任务,因此这里是我经常使用的链。我们首先根据已知模式构建所有文件名。然后我们一次读完它们,没有任何循环。最后,我们可能希望将文件列表组合成一个数据框。

n <- 4
prefix <- 'some_prefix'
file_names <- paste0(prefix, '-', seq_len(n), '.log')
#[1] "some_prefix-1.log" "some_prefix-2.log" "some_prefix-3.log" "some_prefix-4.log"
# a list of data frames
df_list <- lapply(file_names, function(x) read.csv(x, head=F, sep='\t', skip=11))
# total data frame (if all data frames are compatible)
df_total <- do.call(cbind, df_list)
于 2014-04-23T14:34:53.497 回答
1

一种方法是将它们放在一个列表中,如下所示:

raw_data <- vector(mode = "list", length = numruns) #allocate space for list
for (i in 1:numruns){ raw_data[[i]] <- read.csv(name[i], header=F, sep="\t", skip=11)}

您可以使用lapplydo 在一个命令中执行此操作 - 将来可能值得一读。

您的代码不起作用的原因是您将字符串“raw_data_1”分配给 raw_data,然后用文件中的数据覆盖它。如果您真的想走有很多变量的路线,请查看assign()and get()

于 2014-04-23T14:26:23.430 回答