在R中改进/避免for-Loop

时间:2017-10-03 15:57:12

标签: r

我有几个测量数据文件,我想自动打开,取出一些值并将它们放在一个数据帧中。

首先,我搜索文件名,逐个打开它们(在for循环中)并将它们组合在一起。代码工作正常。但是因为有很多文件,所以需要的时间太长。目前我无法想到你有任何其他方式来做这件事......我的问题是,是否可以选择加快这一过程?也许没有使用循环?特别是避免第二个循环会改善性能。

我试着做一个代码的最小例子。在这个例子中,某些行(例如data_s)没有多大意义,但实际上它们确实存在;-)

all.files     <- list.files(recursive = T)   
df            <- data.frame(matrix(, nrow=1000, ncol=242))

for (i in 1:length(all.files) {
    Data      <- read.table(all.files[i]), header=F)    
    name      <- Data[i,2] 
    data_s    <- i+6

    for (k in 1:240){
             df[data_s+k,k+2]     <- Data[24+k,3]
    }

assign(name,df)
rm(name,df)
}

这就是&#34;数据&#34;的结构:

enter image description here

这就是我的最终文件(&#34; df&#34;)应如何显示:

enter image description here

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

我会使用data.table-package及其fread函数。它比read.table快得多,语法通常比data.frame语法更好。您的问题应该通过以下方式解决:

library(dplyr) # for the left_join
library(data.table) # data.table for fread and nicer syntax
final <- data.table(dateandtime = as.character())
for (file in list.files(recursive = T)) {
   new <- fread(file, stringsAsFactors = F)
   final <- data.table(full_join(final, new, by = "dateandtime"))
}

EDIT1:将“left_join”更改为“full_join”以便考虑案例 - 文件之间的“日期和时间”不同。

EDIT2:使用“dateandtime”列实例化“final”-data.table,以使连接在第一个元素上工作。

答案 1 :(得分:0)

首先我按照你的描述创建了一个数据。

df <- diag(nrow = 10,ncol = 10)
df[df == 0] <- NA
df <- as.data.frame(df)
df

df$X <- 7


library(reshape2)

比我使用包reshape2的函数melt()

melt(df,id.vars = "X",na.rm = TRUE)

我希望这会有所帮助。