我有一个时间序列数据。我存储在txt文件下的数据每日子文件夹每月文件夹。
setwd(".../2018/Jan")
parent.folder <-".../2018/Jan"
sub.folders <- list.dirs(parent.folder, recursive=TRUE)[-1] #To read the sub-folders under parent folder
r.scripts <- file.path(sub.folders)
A_2018 <- list()
for (j in seq_along(r.scripts)) {
A_2018[[j]] <- dir(r.scripts[j],"\\.txt$")}
在这些.txt文件中,我使用以下代码删除了一些不想用于进一步分析的文件。
trim_to_two <- function(x) {
runs = rle(gsub("^L1_\\d{4}_\\d{4}_","",x))
return(cumsum(runs$lengths)[which(runs$lengths > 2)] * -1)
}
A_2018_new <- list()
for (j in seq_along(A_2018)) {
A_2018_new[[j]] <- A_2018[[j]][trim_to_two(A_2018[[j]])]
}
然后,我想通过for循环对整个.txt文件进行rowbind。在此之前,我想删除每个txt文件中的一些行,并添加一个新的列(带有文件名)。以下是我的代码。
for (i in 1:length(A_2018_new)) {
for (j in 1:length(A_2018_new[[i]])){
filename <- paste(str_sub(A_2018_new[[i]][j], 1, 14))
assign(filename, read_tsv(complete_file_name, skip = 14, col_names = FALSE),
)
Y <- r.scripts %>% str_sub(46, 49)
MD <- r.scripts %>% str_sub(58, 61)
HM <- filename %>% str_sub(9, 12)
Turn <- filename %>% str_sub(14, 14)
time_minute <- paste(Y, MD, HM, sep="-")
Map(cbind, filename, SampleID = names(filename))
}
}
但是我没有得到我想要的输出。我试着用其他的例子编码。有人能帮助解释我的代码缺少了什么吗?
1条答案
按热度按时间34gzjxbg1#
你的代码看起来过于复杂了。但是你的问题并不是100%清楚的(例如,你的文件名中决定导入什么和不导入什么的模式是什么?)。这里有一些可以大大简化代码的指针,很可能避免你遇到的问题。
使用
lapply()
或purrr
包中的map()
代替for循环进行迭代。好处是它将不同的 Dataframe 放在一个列表中,您不需要将多个 Dataframe 分配到环境中它们自己的对象中。由于您标记了tidyverse,因此我们将使用purrr
函数。例如,您可以检索txt文件路径,使用类似于
然后将
map()
与来自readr
的read_tsv()
一起使用,如下所示:然后,您可以再次使用
lapply()
或map()
对每个数据框应用操作。最简单的方法是创建自定义函数,然后将其应用于每个数据框:然后使用
map2()
应用此函数,迭代数据和文件名,然后使用list_rbind()
跨行绑定 Dataframe 。