根据R中另一个数据帧中的比较值更改一个数据帧中的值

时间:2015-11-12 15:31:58

标签: r function comparison plyr posixct

我试图在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似乎是一个非常有前景的选择,但我不确定如何将它用于这个特定的问题。

2 个答案:

答案 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小时。