我正在努力解决以下问题。我需要从多个目录导入多个.csv文件并将它们附加到数据框中。我想出了如何使用dir()
和lapply
执行此操作。这是一个结果示例:
structure(list(datetime = c("11/05/14 13:00", "11/05/14 13:30",
"11/05/14 14:00", "11/05/14 14:30", "11/05/14 15:00", "02/08/12 08:32",
"02/08/12 08:52", "02/08/12 09:12", "02/08/12 09:32", "02/08/12 09:52"
), file = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L)), class = "data.frame", row.names = c(NA,
-10L), .Names = c("datetime", "file"))
datetime file
1 11/05/14 13:00 1
2 11/05/14 13:30 1
3 11/05/14 14:00 1
4 11/05/14 14:30 1
5 11/05/14 15:00 1
6 02/08/12 08:32 2
7 02/08/12 08:52 2
8 02/08/12 09:12 2
9 02/08/12 09:32 2
10 02/08/12 09:52 2
上面,datetime是一个字符对象和文件整数。我希望将datetime转换为POSIXct。现在我面临的问题是第一个文件中的日期是dd / mm / yy,第二个文件中是mm / dd / yy。如何告诉R将所有dd / mm / yy和mm / dd / yy格式转换为posixct(yyyy / mm / dd)而不会混淆两种格式都有意义的日期?即11/05/14 13:00应转换为2014-05-11 13:00:00,并且02/08/12 08:32应该成为2012-02-08 08:32:00。需要说明的是,文件中只有1种格式,但文件之间只有多种格式。
我尝试使用lubridate
包使用在线找到的解决方案。然而我意识到这个解决方案不区分格式,只是转换它可以做的任何事情。以下是我的剧本。
all_csv = dir(dir, recursive=TRUE, full.names=TRUE, pattern="\\.csv$")
myfiles = lapply(all_csv, read.csv,sep=sep,dec=dec,stringsAsFactor=F,header=F,skip=2)
for(i in 1:length(myfiles)){
library(lubridate)
mdy_hms1 <- mdy_hms(myfiles[[i]]$datetime, tz="US/Eastern")
dmy_hms1 <- dmy_hms(myfiles[[i]]$datetime, tz="US/Eastern")
dmy_hms1[is.na(dmy_hms1)]<-mdy_hms1[is.na(dmy_hms1)]
myfiles[[i]]$time<-dmy_hms1
}
感谢您的帮助。
答案 0 :(得分:1)
对于那些尝试实现类似功能的人,请尝试使用strsplit()
。这允许您提取日期和时间组件,然后在提取的值&lt; = 12或&gt; 12时使用2 if循环。
threshold <- sapply(strsplit(as.character(myfiles[[1]]$time), '/'), function(x) x[1])
if(max(threshold) > 12){
dmy_hms1 <- dmy_hms(myfiles[[i]]$time, tz=TZ)
myfiles[[i]]$time<-dmy_hms1 # overwrite existing time column
}
if(max(threshold) <=12){
mdy_hms1 <- mdy_hms(myfiles[[i]]$time, tz=TZ)
myfiles[[i]]$time<-mdy_hms1 # overwrite existing time column
}