我正在构建一个循环超过10-1000个文件的复杂代码,并根据6个分组列计算每个文件的一大堆摘要统计信息。一切正常,但在双应用结构中,我也试图从文件名中提取日期并将其转换为日期格式,并将其作为列添加到每个数据框。
在我的完整代码中没有日期转换,以及在此示例代码中它工作正常,但是在其中进行转换时,似乎会导致循环突然产生奇怪的错误。
我已经尝试了十几种方法来使其发挥作用。通常单个字符串到日期格式对我来说不是问题,但是如何在这个循环结构中使这个工作?
起初我认为问题是日期格式转换不起作用,但似乎有效,但它会导致rbindlist代码出现问题。
Error in rbindlist(ClusterResultlist[[cl]]) :
Column 2 of item 1 is length 11, inconsistent with first column of that item which is length 10. rbind/rbindlist doesn't recycle as it already expects each item to be a uniform list, data.frame or data.table
我不知道为什么它声称长度存在差异,或者如何解决它。
问题:如何在循环内或之后将字符串转换为日期格式。
我的代码:
myfiles <- list("PICO in situ 55 10 100 100 100 2016-05-06 19u03_clustered_newtest1.csv", "PICO in situ 55 10 100 100 100 2016-05-07 19u03_clustered_newtest1.csv")
## list of clustering columns to summarize over
Clusterlist <- c('Cluster_FP1', 'Cl_names_FP1', 'GR_names_FP1', 'Cluster_FP2', 'Cl_names_FP2', 'GR_names_FP2') #
ClusterResultlist <- vector("list", length(Clusterlist))
names(ClusterResultlist) <- Clusterlist
SummarizeData <- function(y){
lapply(Clusterlist, function(z) {
datetime <- substr(y, nchar(y) -38, nchar(y) -23)
FullCounts <- data.frame(DummyIndex = 1:10)
FullCounts$DateTime <- strptime(datetime,format = "%Y-%m-%d %Hu%M")
ClusterResultlist[[z]][[y]] <<- FullCounts
})}
# run the function over all files
mapply(SummarizeData, y = myfiles)
# create 6 main dataframes out of all sub data frames
lapply(Clusterlist, function(cl) { ClusterResultlist[[cl]] <<- rbindlist(ClusterResultlist[[cl]]) })
更新 我们现在有两个(部分)解决方案,但它们不会像rbindlist那么快我相信我的实际大型数据对象。
我尝试在最终的ClusterResultList上的循环外进行转换,但是会抛出此错误:
lapply(Clusterlist, function(cl) { ClusterResultlist[[cl]] <<- rbindlist(ClusterResultlist[[cl]]) })
lapply(Clusterlist, function(cl) { ClusterResultlist[[cl]]$DateTime <<- strptime(ClusterResultlist[[cl]]$DateTime,format = "%Y-%m-%d %Hu%M") })
In `[<-.data.table`(x, j = name, value = value) :
Supplied 11 items to be assigned to 20 items of column 'DateTime' (recycled leaving remainder of 9 items).
答案 0 :(得分:1)
如何使用rbind
代替rbindlist
?
lapply(Clusterlist, function(cl) ClusterResultlist[[cl]] <<- do.call(rbind, ClusterResultlist[[cl]]))
答案 1 :(得分:1)
在lubridate
的帮助下修复日期修复了rblindlist
的问题。
替换:
FullCounts$DateTime <- strptime(datetime,format = "%Y-%m-%d %Hu%M")
使用:
FullCounts$DateTime <- lubridate::ymd_hms(strptime(datetime,format = "%Y-%m-%d %Hu%M"))