【发布时间】:2019-10-24 22:27:02
【问题描述】:
我有几个包含日期和降水信息的 csv 文件。这是示例数据:
目标:
我想一一读完,那么:
1- 将日期列分为年、月、日。
2- 从每个列中获取特定列。
3- 为从每个 csv 文件中提取的信息创建一个数据框。
4- 最后,将所有这些帧粘贴到一个 txt 文件中。
这是我的代码:
rm(list=ls())
## where is the main folder?
setwd("C:/Users/Downloadspr_day_ECMWF")
## reading all csv files:
list_csv_files <- basename(list.files(pattern = ".*_daily_results.*csv", recursive = TRUE))
## a loop here to read all csv files one by one and save their info in one txt file:
result <- list()
counter <- 1
for (i in 1:length(list_csv_files)){
MyData <- read.csv(list_csv_files[[i]], header=TRUE, sep=",")
head(MyData)
## separating year , month , date from the "Date.Precipitation_mm" column inside the csv file:
date_column <- MyData$Date.Precipitation_mm
date_column
year_date <- format(as.Date(date_column, format="%Y-%m-%d"),"%Y")
month_date <- format(as.Date(date_column, format="%Y-%m-%d"),"%m")
day_date <- format(as.Date(date_column, format="%Y-%m-%d"),"%d")
## reading Alberta columns in MyData :
Alberta_column <- MyData$Alberta
Alberta_column
## creating a data frame to put our data inside it:
txt_file_data_frame <- data.frame(year_date, month_date, day_date, Alberta_column)
## a counter to save all data frames consecutively:
for (j in 1:length(txt_file_data_frame)) {
result[[counter]] <- txt_file_data_frame[j]
counter <- counter + 1
}
}
## write the txt file:
write.table(txt_file_data_frame, file = "myTXT.txt", row.names = FALSE, dec = ".", sep = "\t", quote = FALSE)
但生成的 txt 文件仅包含最后的 csv 文件信息!!像这样:
我想将所有数据帧保存在最终的 txt 文件中。
有人知道这个挑战的解决方案吗?
任何帮助或评论将不胜感激。
【问题讨论】:
-
这是样本数据的精美“撕页”视图。虽然我很想知道你用什么来制作它......请不要发布代码/数据/错误的图像:它不能被复制或搜索(SEO),它会破坏屏幕阅读器,它可能不适合在一些移动设备上很好。参考:meta.stackoverflow.com/a/285557/3358272(和xkcd.com/2116)。请直接包含代码或数据(例如,
dput(head(x))或data.frame(...))。在相关说明中,当 (not if) 指向数据文件的链接失效时,问题变得无法重现,请给我们示例数据(dput或data.frame)。 -
我建议不要在
for循环中执行此操作并迭代地构建一个框架:虽然它在逻辑上工作,但要知道 R 将在每次向其中添加行时复制整个data.frame,因此你不断添加文件它会显着减慢。最好将每个文件一次加载到list中,然后一次将它们合并。例如,要问标题中的问题,可能是alldat <- do.call(rbind, lapply(list.files(...), read.csv))。 -
一种选择是将
write.table移动到循环内并使用选项append=TRUE和col.names=F。如果您有很多文件,这是低效的,写入磁盘很耗时。 -
r2evans,感谢您的评论。我使用图片并分享玩具代码和示例数据的原因是为了让那些想要自己运行代码的人更直接。顺便说一句,很抱歉这可能导致失禁。至于撕裂的页面,我使用 Snagit 这样做。这是免费的。谷歌一下就行了。