我试图在POSIXct列中减去一小时到日期/时间,该时间早于或等于该特定ID的不同比较数据帧中所述的时间。
例如:
#create sample data
Time<-as.POSIXct(c("2015-10-02 08:00:00","2015-11-02 11:00:00","2015-10-11 10:00:00","2015-11-11 09:00:00","2015-10-24 08:00:00","2015-10-27 08:00:00"), format = "%Y-%m-%d %H:%M:%S")
ID<-c(01,01,02,02,03,03)
data<-data.frame(Time,ID)
产生这个:
Time ID
1 2015-10-02 08:00:00 1
2 2015-11-02 11:00:00 1
3 2015-10-11 10:00:00 2
4 2015-11-11 09:00:00 2
5 2015-10-24 08:00:00 3
6 2015-10-27 08:00:00 3
然后我有另一个数据框,其中包含要比较的每个ID的关键日期和时间。数据中的时间应与比较数据中的比较与其关联的特定ID进行比较。如果数据中的时间值早于或等于比较值,则应从数据中的值中减去一小时:
#create sample comparison data
Comparison<-as.POSIXct(c("2015-10-29 08:00:00","2015-11-02 08:00:00","2015-10-26 08:30:00"), format = "%Y-%m-%d %H:%M:%S")
ID<-c(01,02,03)
ComparisonData<-data.frame(Comparison,ID)
这应该是这样的:
Comparison ID
1 2015-10-29 08:00:00 1
2 2015-11-02 08:00:00 2
3 2015-10-26 08:30:00 3
总之,代码应检查某个ID的所有时间,以查看是否有任何早于或等于ComparisonData中指定的值,如果是,则减去一小时。这应该将此数据框作为输出:
Time ID
1 2015-10-02 07:00:00 1
2 2015-11-02 11:00:00 1
3 2015-10-11 09:00:00 2
4 2015-11-11 09:00:00 2
5 2015-10-24 07:00:00 3
6 2015-10-27 08:00:00 3
我已经查看了this之类的类似解决方案,但我无法理解如何使用该特定ID使用正确的时间来检查时间。
我认为ddply似乎是一个非常有前景的选择,但我不确定如何将它用于这个特定的问题。
答案 0 :(得分:2)
这是使用data.table
的快速有效的解决方案。首先,我们按ID
加入两个数据集,然后修改低于或等于Time
的{{1}}
Comparison
或者,我们可以在使用library(data.table) # v1.9.6+
setDT(data)[ComparisonData, end := i.Comparison, on = "ID"]
data[Time <= end, Time := Time - 3600L][, end := NULL]
data
# Time ID
# 1: 2015-10-02 07:00:00 1
# 2: 2015-11-02 11:00:00 1
# 3: 2015-10-11 09:00:00 2
# 4: 2015-11-11 09:00:00 2
# 5: 2015-10-24 07:00:00 3
# 6: 2015-10-27 08:00:00 3
加入时一步完成此操作(不确定效率如何)
ifelse
答案 1 :(得分:0)
我相信会有比这更好的解决方案,不过,我觉得这很有效。
for(i in 1:nrow(data)) {
if(data$Time[i] < ComparisonData[data$ID[i], 1]){
data$Time[i] <- data$Time[i] - 3600
}
}
# Time ID
#1 2015-10-02 07:00:00 1
#2 2015-11-02 11:00:00 1
#3 2015-10-11 09:00:00 2
#4 2015-11-11 09:00:00 2
#5 2015-10-24 07:00:00 3
#6 2015-10-27 08:00:00 3
这将遍历data
中的每一行。
ComparisonData[data$ID[i], 1]
获取time
中相应ComparisonData
的{{1}}列。如果这大于ID
中的Time
列,则将时间减少1小时。