如下所示的数据框。 3名员工每天有小时读数,但不完整(每位员工每天有24个读数)。
了解员工在当天的阅读次数不同。现在只对当天读数最多的员工感兴趣。
有很多天。它希望在当天为大多数行插入缺失的(每小时)行。也就是说,2018-03-02仅为杰克插入,2018-03-03仅为大卫插入,2018-03-04仅为凯特插入。
我尝试了来自this question的这些行(即使它们没有区别地填充所有行)但没有到达那里。
如何在R?
中完成yadcf.exFilterColumn(oTable, [
[0, ['Some Data 1', 'Some Data 2']]
]);
答案 0 :(得分:1)
试试这段代码:
确定每个小时和所有工作人员
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
答案 1 :(得分:1)
选项是单独执行此操作。创建一个感兴趣的日期data.table
和相应的“员工”,并获得完整的日期时间序列,然后我们rbind
使用原始数据集并使用条件,我们汇总数据< / p>
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