我有两个大的数据帧df1
和df2
,由于它们表示相同的周期,因此理论上应该具有相同数量的行。它们在相同的日期和时间开始,并在相同的日期和时间结束。但是我发现它们的单行长度不同。我想确切知道彼此之间缺少哪一行或哪个日期。例如:
df1<- data.frame(DateTime=c("2016-08-01 06:00:00","2016-08-01 07:00:00","2016-08-01 09:00:00","2016-08-01 10:00:00","2016-08-01 11:00:00","2016-08-01 12:00:00","2016-08-01 13:00:00","2016-08-01 14:00:00","2016-08-01 15:00:00","2016-08-01 16:00:00"),
Var1=c(23,34,34,56,54,34,2,34,78,65))
df1$DateTime<- as.POSIXct(df1$DateTime, format ="%Y-%m-%d %H", tz = "UTC")
df2<- data.frame(DateTime=c("2016-08-01 06:00:00","2016-08-01 07:00:00","2016-08-01 08:00:00","2016-08-01 09:00:00","2016-08-01 10:00:00","2016-08-01 11:00:00","2016-08-01 12:00:00","2016-08-01 13:00:00","2016-08-01 14:00:00","2016-08-01 15:00:00","2016-08-01 16:00:00"),
Var2=c(34,56,75,43,45,67,8,67,89,09,23))
df2$DateTime<- as.POSIXct(df2$DateTime, format ="%Y-%m-%d %H", tz = "UTC")
df1
DateTime Var1
1 2016-08-01 06:00:00 23
2 2016-08-01 07:00:00 34
3 2016-08-01 09:00:00 34
4 2016-08-01 10:00:00 56
5 2016-08-01 11:00:00 54
6 2016-08-01 12:00:00 34
7 2016-08-01 13:00:00 2
8 2016-08-01 14:00:00 34
9 2016-08-01 15:00:00 78
10 2016-08-01 16:00:00 65
df2
DateTime Var2
1 2016-08-01 06:00:00 34
2 2016-08-01 07:00:00 56
3 2016-08-01 08:00:00 75
4 2016-08-01 09:00:00 43
5 2016-08-01 10:00:00 45
6 2016-08-01 11:00:00 67
7 2016-08-01 12:00:00 8
8 2016-08-01 13:00:00 67
9 2016-08-01 14:00:00 89
10 2016-08-01 15:00:00 9
11 2016-08-01 16:00:00 23
我想找出他们不共享的日期时间是什么,或者哪一行是他们在df1$DateTime
和df2$DateTime
之间共享相同日期时间的最后一行,或者是哪一行df1
和df2
在DateTime
方面开始有所不同。有了这些答案,就足够了。
我没有找到如何用日期时间解决这个问题。
在此示例中,他们不共享日期时间2016-08-01 08:00:00
。 df1
和df2
在同一行直到第2行共享相同的日期时间,而它们在第3行中的日期时间开始有所不同。
答案 0 :(得分:2)
如果使用all=TRUE
,很容易发现不匹配的日期时间:
merge(df1,df2, all=TRUE)
DateTime Var1 Var2
1 2016-08-01 06:00:00 23 34
2 2016-08-01 07:00:00 34 56
3 2016-08-01 08:00:00 NA 75
4 2016-08-01 09:00:00 34 43
5 2016-08-01 10:00:00 56 45
6 2016-08-01 11:00:00 54 67
7 2016-08-01 12:00:00 34 8
8 2016-08-01 13:00:00 2 67
9 2016-08-01 14:00:00 34 89
10 2016-08-01 15:00:00 78 9
11 2016-08-01 16:00:00 65 23
还可以在两个日期时间向量上使用%in%
的取反。
df1$DateTime[ !df2$DateTime %in% df1$DateTime]
[1] "2016-08-01 09:00:00 UTC"
第一种方法的优点是,您不必先弄清楚哪个较短,而且无需处理非交集为“对称”的情况,因为每个交点在向量中都有一个缺失值。其他。还有一些“设置”功能:setdiff
,intersect
和union
,但是它们确实删除了属性,并且日期时间最终以数字形式出现。
答案 1 :(得分:1)
非常简单-
匹配-
> intersect(as.character(df2$DateTime),as.character(df1$DateTime))
[1] "2016-08-01 06:00:00" "2016-08-01 07:00:00" "2016-08-01 09:00:00" "2016-08-01 10:00:00" "2016-08-01 11:00:00" "2016-08-01 12:00:00" "2016-08-01 13:00:00"
[8] "2016-08-01 14:00:00" "2016-08-01 15:00:00" "2016-08-01 16:00:00"
不匹配
> setdiff(as.character(df2$DateTime),as.character(df1$DateTime))
[1] "2016-08-01 08:00:00"
注意-您还可以使用%like%
中的data.table
提取完整的行。