【问题标题】:How to insert missing dates/times using R based on criteria?如何根据条件使用 R 插入缺失的日期/时间?
【发布时间】:2018-08-12 21:45:22
【问题描述】:

如下所示的数据框。 3 名员工每天有每小时读数,但不完整(每名员工每天应有 24 次读数)。

了解员工每天的阅读次数不同。现在只对当天阅读次数最多的员工感兴趣。

有很多天。它希望为当天最多的行插入缺失的(每小时)行。也就是说,2018-03-02 仅插入 Jack’s,2018-03-03 仅插入 David,2018-03-04 仅插入 Kate。

我从this question 尝试了这些行(尽管它们完全没有区分)但没有到达那里。

如何在 R 中完成?

date_time <- c("2/3/2018 0:00","2/3/2018 1:00","2/3/2018 2:00","2/3/2018 3:00","2/3/2018 5:00","2/3/2018 6:00","2/3/2018 7:00","2/3/2018 8:00","2/3/2018 9:00","2/3/2018 10:00","2/3/2018 11:00","2/3/2018 12:00","2/3/2018 13:00","2/3/2018 14:00","2/3/2018 16:00","2/3/2018 17:00","2/3/2018 18:00","2/3/2018 19:00","2/3/2018 21:00","2/3/2018 22:00","2/3/2018 23:00","3/3/2018 0:00","3/3/2018 0:00","3/3/2018 1:00","3/3/2018 2:00","3/3/2018 4:00","3/3/2018 5:00","3/3/2018 7:00","3/3/2018 8:00","3/3/2018 9:00","3/3/2018 11:00","3/3/2018 12:00","3/3/2018 14:00","3/3/2018 15:00","3/3/2018 17:00","3/3/2018 18:00","3/3/2018 20:00","3/3/2018 22:00","3/3/2018 23:00","4/3/2018 0:00","4/3/2018 0:00","4/3/2018 1:00","4/3/2018 2:00","4/3/2018 3:00","4/3/2018 5:00","4/3/2018 6:00","4/3/2018 7:00","4/3/2018 8:00","4/3/2018 10:00","4/3/2018 11:00","4/3/2018 12:00","4/3/2018 14:00","4/3/2018 15:00","4/3/2018 16:00","4/3/2018 17:00","4/3/2018 19:00","4/3/2018 20:00","4/3/2018 22:00","4/3/2018 23:00")
staff <- c("Jack","Jack","Kate","Jack","Jack","Jack","Jack","Jack","Jack","Jack","Jack","Jack","Kate","Jack","Jack","Jack","David","David","Jack","Kate","David","David","David","David","David","David","David","David","David","David","David","David","David","David","David","David","David","Jack","Kate","David","David","Kate","Kate","Kate","Kate","Kate","Kate","Kate","Kate","Kate","Kate","Kate","Kate","Kate","Kate","Kate","Kate","Kate","Jack")
reading <- c(7.5,8.3,7,6.9,7.1,8.1,8.4,8.8,6,7.1,8.9,7.3,7.4,6.9,11.3,18.8,4.6,6.7,7.7,7.8,7,7,6.6,6.8,6.7,6.1,7.1,6.3,7.2,6,5.8,6.6,6.5,6.4,7.2,8.4,6.5,6.5,5.5,6.7,7,7.5,6.5,7.5,7.2,6.3,7.3,8,7,8.2,6.5,6.8,7.5,7,6.1,5.7,6.7,4.3,6.3)
df <- data.frame(date_time, staff, reading)

【问题讨论】:

  • 你的意思是library(dplyr);library(tidyr);df %&gt;% mutate(date_time = dmy_hm(date_time)) %&gt;% complete(date_time = seq(from = min(date_time), to = max(date_time), by = "1 hour"), staff, fill = list(reading = 0))
  • @akrun,先生,早上好。感谢您的评论。它给了我:评估错误:找不到函数“dmy_hm”...
  • 来自lubridate。我忘了
  • @akrun。一个不错的,但它可以满足每个人的 3 天。我希望 2018-03-02 仅插入 Jack's,2018-03-03 仅插入 David,2018-03-04 仅插入 Kate。
  • 看起来像df %&gt;% mutate(date_time = dmy_hm(date_time), date = as.Date(date_time)) %&gt;% complete(date_time = seq(as.POSIXct(paste(date[1], "00:00:00"), tz = "GMT"), length.out = 24, by = "1 hour"), staff, fill = list(reading = 0)) %&gt;% select(-date)

标签: r dataframe time-series missing-data


【解决方案1】:

可以选择单独执行此操作。创建一个data.table感兴趣的日期和相应的'staff',并得到日期时间的完整序列,然后我们rbind这个与原始数据集和使用条件,我们总结数据

library(data.table)
stf <- c("Jack", "David", "Kate")
date <- as.Date(c("2018-03-02", "2018-03-03", "2018-03-04"))
df1 <- data.table(date, staff= stf)[, .(date_time = seq(as.POSIXct(paste(date, "00:00:00"), 
       tz = "GMT"),
           length.out = 24, by = "1 hour")), staff]

setDT(df)[, date_time := as.POSIXct(date_time, "%d/%m/%Y %H:%M", tz = "GMT")]
res <- rbindlist(list(df, df1), fill = TRUE)[, 
     .(reading = if(any(is.na(reading))) sum(reading, na.rm = TRUE) else reading),
         .(staff, date_time)]

table(res$staff, as.Date(res$date_time))

#         2018-03-02 2018-03-03 2018-03-04
#  David          3         24          2
#  Jack          24          1          1
#  Kate           3          1         24

head(res)
#   staff           date_time reading
#1:  Jack 2018-03-02 00:00:00     7.5
#2:  Jack 2018-03-02 01:00:00     8.3
#3:  Kate 2018-03-02 02:00:00     7.0
#4:  Jack 2018-03-02 03:00:00     6.9
#5:  Jack 2018-03-02 05:00:00     7.1
#6:  Jack 2018-03-02 06:00:00     8.1

tail(res)
#   staff           date_time reading
#1:  Kate 2018-03-04 04:00:00       0
#2:  Kate 2018-03-04 09:00:00       0
#3:  Kate 2018-03-04 13:00:00       0
#4:  Kate 2018-03-04 18:00:00       0
#5:  Kate 2018-03-04 21:00:00       0
#6:  Kate 2018-03-04 23:00:00       0

【讨论】:

  • 谢谢。但附加的 date_time 是类似 1520200800 的值,而不是常规的日期/时间格式。你能看看吗?
  • @MarkK 我想我知道为什么它会为你这样做,因为我忘了在我的代码中粘贴 date_time 转换行。你现在可以检查一下吗?
  • 现在好了!你确实是大师!
  • @MarkK 是的,你是由unique(df$staff) 完成的,相应的日期似乎是定制的
  • 像你这样的大师让世界变得美丽!
【解决方案2】:

试试这个代码:

确定每天的每个小时和所有工作人员

date_h<-seq(as.POSIXlt(min(date_time),format="%d/%m/%Y %H:%M"),as.POSIXlt(max(date_time),format="%d/%m/%Y %H:%M"),by=60*60)
staff_u<-unique(staff)
comb<-expand.grid(staff_u,date_h)
colnames(comb)<-c("staff","date_time")

df 中的统一日期格式

df$date_time<-as.POSIXlt(df$date_time,format="%d/%m/%Y %H:%M")

合并信息

out<-merge(comb,df,all.x=T)

你的输出:

head(out)
  staff           date_time reading
1  Jack 2018-03-02 00:00:00     7.5
2  Jack 2018-03-02 01:00:00     8.3
3  Jack 2018-03-02 02:00:00      NA
4  Jack 2018-03-02 03:00:00     6.9
5  Jack 2018-03-02 04:00:00      NA
6  Jack 2018-03-02 05:00:00     7.1

【讨论】:

  • ,谢谢。但它适合 2018-03-02 和 2018-03-03 的每个人。 2018-03-04 显示每个人的数字都是奇数...
  • 好的,试试 all.x=T
  • 问题可能与这种重复数据有关:2018-03-04 00:00:00 David 6.7 - 2018-03-04 00:00:00 David 7.0;相同的数据相同的工作人员
猜你喜欢
  • 2013-05-23
  • 1970-01-01
  • 2020-08-18
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2017-12-15
相关资源
最近更新 更多