我有几个测量数据文件,我想自动打开,取出一些值并将它们放在一个数据帧中。
首先,我搜索文件名,逐个打开它们(在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;的结构:
这就是我的最终文件(&#34; df&#34;)应如何显示:
非常感谢你的帮助!
答案 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)
我希望这会有所帮助。