2

我有大约 100 个文件(长文件名),其中包含来自模拟的数据。主题是两种物质的降解,所以我有 3 个相关列:时间、物质 1 的相对浓度(Sub1,从 1.0 到零)和相对浓度。物质 2 (Sub2)。

我想读取文件,确定每个基板 99% 的退化时间,并将适当的时间保存在数据框中。现在我将结果保存在文本文件中,但这很不舒服,你会发现。

names<-dir(pattern="txt")
z <- 0.99 #degradation level
a <- 1-z
for (n in names){
   data <- read.table(file=n,header=T)
   attach(data)
   matchs1 <- Time[abs(Sub1-a)==min(abs(Sub1-a))]  
   matchs2 <- Time[abs(Sub2-a)==min(abs(Sub2-a))]
   degrad <- cbind(matchs1,matchs2)
   setwd("C:/.../subdirectory")
   write.table(degrad, file=paste(n,"99",".txt"),sep=" ",row.names=FALSE)
}

我不想将文件写入文件,而是将结果(降级)写入连续行的数据框中。

由于我仍然是初学者,我认为还有一种更简单的方法可以做到这一切?

预先感谢您的帮助 ...

4

2 回答 2

2

我通常在这些情况下使用的框架是:

do.call(rbind, lapply(file_list, function(file_name) {
  # open file_name, do whatever processing
  # then return result as a data.frame (with data for just this one file,
  # then rbind will bind everything together)
  # in your example that would be the data.frame "degrad"
})) -> your_combined_dataframe

如果你使用data.table's 代替,你可以替换do.call(rbind,byrbindlist(

于 2013-06-12T20:27:36.843 回答
1

您不必for在这里使用循环,但使用其他任何东西都不太可能看到速度的大幅提升,因为for与读取数据相比,循环的开销是最小的。

要获得 data.frame 只需稍微更改for循环以输出到数据帧,您可以预先分配行数等于文件数

# Pre-allocate results data.frame
res <- data.frame( matchs1 = numeric(length(names)) , matchs2 = numeric(length(names)) )

#  Fill it
for (i in 1:length(names)){
   data <- read.table(file=names[i],header=T)
   matchs1 <- with( data, Time[abs(Sub1-a)==min(abs(Sub1-a))] )  
   matchs2 <- with( data , Time[abs(Sub2-a)==min(abs(Sub2-a))] )
   res[i,] <- cbind(matchs1,matchs2) 
}

绝对不应该使用attach. 改为使用with。我无法完全测试这一点,因为我无权访问您的文件和数据,但我认为这会奏效。

于 2013-06-12T20:15:36.183 回答