读取多个文件,计算一些内容,在dataframe(R)中保存结果

时间:2013-06-12 20:02:01

标签: r

我有大约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)
}

我不想写文件,而是想在连续的行中的数据帧中写出结果(降级)。

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

提前感谢您的帮助......

2 个答案:

答案 0 :(得分: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,则可以do.call(rbind,替换rbindlist(

答案 1 :(得分: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。我无法完全测试,因为我无法访问您的文件和数据,但我认为这将有效。