问题
I would like to merge two data tables, but one of them has column ddate
with POSIXct
class and another one has column ddate
with Date
class.
I would expect result data table to has POSIXct
class, but the actual result depends on sequence of arguments passed to rbind
:
zz1 <- "or,d,ddate,rdate,changes,class,price,fdate,company,number,minutes,added,source
VA1,VA2,2014-05-24,,0,0,2124,2014-05-22 15:50:16,,,,2014-05-22 12:20:03,ss
VA1,VA2,2014-05-26,,0,0,2124,2014-05-22 15:03:44,,,,2014-05-22 12:20:03,s1
VA1,VA2,2014-06-05,,0,0,2124,2014-05-22 15:48:24,,,,2014-05-22 12:20:03,s1
VA1,VA2,2014-06-09,,0,0,2124,2014-05-22 15:37:35,,,,2014-05-22 12:20:03,s2
VA1,VA2,2014-06-16,,0,0,2124,2014-05-22 14:17:33,,,,2014-05-22 12:20:03,ss"
zz2 <- "or,d,ddate,rdate,changes,class,price,fdate,company,number,minutes,added,source
VA3,VA4,2014-05-24 12:23:00,,0,0,2124,2014-05-22 15:50:16,,,,2014-05-22 12:20:03,ss
VA1,VA2,2014-05-26 14:00:01,,0,0,2124,2014-05-22 15:03:44,,,,2014-05-22 12:20:03,s1
VA5,VA6,2014-06-05 18:00:04,,0,0,2124,2014-05-22 15:48:24,,,,2014-05-22 12:20:03,s1
VA7,VA8,2014-06-09 18:00:07,,0,0,2124,2014-05-22 15:37:35,,,,2014-05-22 12:20:03,s2
VA9,VA0,2014-06-16 19:00:20,,0,0,2124,2014-05-22 14:17:33,,,,2014-05-22 12:20:03,ss"
columnClasses <- c("factor", "factor", "Date", "factor", "integer", "factor", "integer", "factor", "factor", "factor", "integer", "factor", "factor")
dt1 <- read.table(text=zz1, header = TRUE, sep = ",", comment.char = "", quote = "", na.strings = c(""), colClasses = columnClasses)
columnClasses <- c("factor", "factor", "POSIXct", "factor", "integer", "factor", "integer", "factor", "factor", "factor", "integer", "factor", "factor")
dt2 <- read.table(text=zz2, header = TRUE, sep = ",", comment.char = "", quote = "", na.strings = c(""), colClasses = columnClasses)
dt <- rbind(dt1, dt2)
class(dt$ddate) # [1] "Date"
dt <- rbind(dt2, dt1)
class(dt$ddate) # [1] "POSIXct" "POSIXt"
What should I do to always have POSIXct
? Since I can not control the sequence when I get the data from CSV files like below:
tables <- lapply(files, readCSVFile)
dt <- rbindlist(tables, fill = TRUE)
回答1:
I think you could treat each file when you load with read.csv
so that the ddate
variable is converted to POSIXct
. Then the merging can be better controlled. This can be accomplished by creating your own function to be used by lapply
.
Example
ddate.convert = function(x){tmp <- readcsv(x); tmp$ddate <- as.POSIXct(tmp$ddate); tmp}
tables <- lapply(files, FUN=ddate.convert)
dt <- rbindlist(tables, fill = TRUE)
来源:https://stackoverflow.com/questions/29369336/how-to-use-rbind-to-merge-data-tables-with-posixct-and-date-column-classes