插入缺失date/时间的行
我是R新手,但已经转向它来解决我正在尝试处理的大型数据集的问题。 目前我有4列的数据(Y值)设置对分钟间隔时间戳(月/日/年小时:分钟)(X值)如下:
timestamp tr tt sr st 1 9/1/01 0:00 1.018269e+02 -312.8622 -1959.393 4959.828 2 9/1/01 0:01 1.023567e+02 -313.0002 -1957.755 4958.935 3 9/1/01 0:02 1.018857e+02 -313.9406 -1956.799 4959.938 4 9/1/01 0:03 1.025463e+02 -310.9261 -1957.347 4961.095 5 9/1/01 0:04 1.010228e+02 -311.5469 -1957.786 4959.078
我遇到的问题是缺less一些时间戳值 – 例如,9/1/01 0:13和9/1/01 0:27之间可能有差距,并通过数据集这种差距是不规则的。 我需要将这些系列中的几个放到同一个数据库中,并且因为每个系列的缺失值不同,所以date目前不在每一行上alignment。
我想为这些缺less的时间戳生成行,并填充空白值(没有数据,不是零)的Y列,以便我有一个连续的时间序列。
我真的不太确定从哪里开始(在我学习之前,并没有真正使用过R),但是任何帮助都是值得赞赏的。 我迄今为止安装了chron和动物园,因为它似乎可能是有用的。
谢谢!
我认为最简单的事情是先设置Date,如前所述,转换为动物园,然后设置一个合并:
df$timestamp<-as.POSIXct(df$timestamp,format="%m/%d/%y %H:%M") df1.zoo<-zoo(df[,-1],df[,1]) #set date to Index df2 <- merge(df1.zoo,zoo(,seq(start(df1.zoo),end(df1.zoo),by="min")), all=TRUE)
开始和结束都是从你的df1(原始数据)给出的,你按照例如min来设置。 all = TRUE将缺失date的所有缺失值设置为NAs。
这是一个古老的问题,但我只是想发布处理这个问题的dplyr方式,因为我遇到这个post,同时寻找类似问题的答案。 我发现它比动物园的方法更直观,更容易。
library(dplyr) ts <- seq.POSIXt(as.POSIXct("2001-09-01 0:00",'%m/%d/%y %H:%M'), as.POSIXct("2001-09-01 0:07",'%m/%d/%y %H:%M'), by="min") ts <- seq.POSIXt(as.POSIXlt("2001-09-01 0:00"), as.POSIXlt("2001-09-01 0:07"), by="min") ts <- format.POSIXct(ts,'%m/%d/%y %H:%M') df <- data.frame(timestamp=ts) data_with_missing_times <- full_join(df,original_data) timestamp tr tt sr st 1 09/01/01 00:00 15 15 78 42 2 09/01/01 00:01 20 64 98 87 3 09/01/01 00:02 31 84 23 35 4 09/01/01 00:03 21 63 54 20 5 09/01/01 00:04 15 23 36 15 6 09/01/01 00:05 NA NA NA NA 7 09/01/01 00:06 NA NA NA NA 8 09/01/01 00:07 NA NA NA NA
同样使用dplyr,这使得更容易做一些事情,比如将所有这些缺less的值更改为其他内容,这在ggplot中进行绘图时非常方便。
data_with_missing_times %>% group_by(timestamp) %>% mutate_each(funs(ifelse(is.na(.),0,.))) timestamp tr tt sr st 1 09/01/01 00:00 15 15 78 42 2 09/01/01 00:01 20 64 98 87 3 09/01/01 00:02 31 84 23 35 4 09/01/01 00:03 21 63 54 20 5 09/01/01 00:04 15 23 36 15 6 09/01/01 00:05 0 0 0 0 7 09/01/01 00:06 0 0 0 0 8 09/01/01 00:07 0 0 0 0
date填充是在R的padr
包中实现的。如果存储数据框,并将date时间variables存储为POSIXct
或POSIXlt
。 所有你需要做的是:
library(padr) pad(df_name)
请参阅vignette(“padr”)或此博客文章的工作。
# some made-up data originaldf <- data.frame(timestamp=c("9/1/01 0:00","9/1/01 0:01","9/1/01 0:03","9/1/01 0:04"), tr = rnorm(4,0,1), tt = rnorm(4,0,1)) originaldf$minAsPOSIX <- as.POSIXct(originaldf$timestamp, format="%m/%d/%y %H:%M", tz="GMT") # Generate vector of all minutes ndays <- 1 # number of days to generate minAsNumeric <- 60*60*24*243 + seq(0,60*60*24*ndays,by=60) # convert those minutes to POSIX minAsPOSIX <- as.POSIXct(minAsNumeric, origin="2001-01-01", tz="GMT") # new df newdf <- merge(data.frame(minAsPOSIX),originaldf,all.x=TRUE, by="minAsPOSIX")
如果你想用上面提到的任何方法获得的NA值replace为零,你可以这样做:
df[is.na(df)] <- 0
(我原本想对Ibollar的回答发表评论,但我缺乏必要的声誉,因此我发表了一个答案)
df1.zoo <- zoo(df1[,-1], as.POSIXlt(df1[,1], format = "%Y-%m-%d %H:%M:%S")) #set date to Index: Notice that column 1 is Timestamp type and is named as "TS" full.frame.zoo <- zoo(NA, seq(start(df1.zoo), end(df1.zoo), by="min")) # zoo object full.frame.df <- data.frame(TS = as.POSIXlt(index(full.frame.zoo), format = "%Y-%m-%d %H:%M:%S")) # conver zoo object to data frame full.vancouver <- merge(full.frame.df, df1, all = TRUE) # merge
我正在寻找类似的东西,而不是填写缺less时间戳,我的数据是在几个月和几天。 所以我想生成一个能够迎合闰年等等的月份序列。 我用lubridate
:
date <- df$timestamp[1] date_list <- c(date) while (date < df$timestamp[nrow(df)]){ date <- date %m+% months(1) date_list <- c(date_list,date) } date_list <- format(as.Date(date_list),"%Y-%m-%d") df_1 <- data.frame(months=date_list, stringsAsFactors = F)
这会给我一个增量月份的date列表。 然后我join
df_with_missing_months <- full_join(df_1,df)