当setdiff不工作时查找两个数据集之间的差异

时间:2018-01-16 17:40:49

标签: r set-difference

我有第2小时和第3小时的现货价格和日前价格数据。它们如下所示。它们从2015-12-31到2011-01-01一路向下。

> head(da2)
             Date Price Hour
43802 2015-12-31 12.56    2
43778 2015-12-30 23.59    2
43754 2015-12-29 17.07    2

> head(sp2)
# A tibble: 6 x 3
         Date  Hour  Price
       <dttm> <chr>  <dbl>
1 2015-12-31     2  17.15
2 2015-12-30     2  26.23
3 2015-12-29     2  23.01

> head(da3)
             Date Price Hour
43803 2015-12-31 10.46    3
43779 2015-12-30 23.55    3
43755 2015-12-29 16.52    3

> head(sp3)
# A tibble: 6 x 3
        Date  Hour  Price
       <dttm> <chr>  <dbl>
1 2015-12-31     3  12.96
2 2015-12-30     3  25.65
3 2015-12-29     3  23.59

我试图将da2 $ Price和sp2 $ Price放在一起,并且在第3小时再次相同。

但不幸的是,我明白了。

> rpdf2<-data.frame(da2$Date,da2$Price,sp2$Price)
Error in data.frame(da2$Date, da2$Price, sp2$Price) : 
arguments imply differing number of rows: 1826, 1822

> rpdf3<-data.frame(da3$Date,da3$Price,sp3$Price)
Error in data.frame(da3$Date, da3$Price, sp3$Price) : 
arguments imply differing number of rows: 1821, 1825

所以我申请了> setdiff(paste(da2$Date),paste(sp2$Date)) 然后我找到了

          [1] "2014-03-30" "2013-03-31" "2012-03-25" "2011-03-27"

没关系。但当我setdiff(paste(da3$Date),paste(sp3$Date))时,它会显示character(0)。 必须有4个观察差异。但我找不到那四个。任何人都可以帮我解决这个问题吗?谢谢。

setdiff(da3$Date,sp3$Date)

结果是

[1] 16800.04 16799.04 16798.04 16797.04 16796.04 16795.04 16794.04 16793.04 16792.04 16791.04 16790.04 16789.04 16788.04 16787.04 16786.04 16785.04 16784.04   [18] 16783.04 16782.04 16781.04 16780.04 16779.04 16778.04 16777.04 16776.04 16775.04 16774.04 16773.04 16772.04 16771.04 16770.04 16769.04 16768.04 16767.04   [35] 16766.04 16765.04 16764.04 16763.04 16762.04 16761.04 16760.04 16759.04 16758.04 16757.04 16756.04 16755.04 16754.04 16753.04 16752.04 16751.04 16750.04   [52] 16749.04 16748.04 16747.04 16746.04 16745.04 16744.04 16743.04 16742.04 16741.04 16740.04 16739.04 16738.04 16737.04 16736.04 16735.04 16734.04 16733.04   [69] 16732.04 16731.04 16730.04 16729.04 16728.04 16727.04 16726.04 16725.04 16724.04 16723.04 16722.04 16721.04 16720.04 16719.04 16718.04 16717.04 16716.04   [86] 16715.04 16714.04 16713.04 16712.04 16711.04 16710.04 16709.04 16708.04 16707.04 16706.04 16705.04 16704.04 16703.04 16702.04 16701.04 16700.04 16699.04

等等。

1 个答案:

答案 0 :(得分:0)

解决这个问题的一种方法(不是很多)不是直接寻找差异就是找到一种方法来加入你的表,无论如何都可以。为此,您只需生成从列表中的第一个日期到最后一个日期的所有日期的完整序列,然后将这些日期依次连接到每个每日和现货价格数据框。每个表中缺少的日期行将在结果连接表中显示为NA列。

示例序列,仅针对此示例缩短为一个月。你将在2011-01-01开始。

somedates = seq(as.Date("2015-12-01"), as.Date("2015-12-31"), by = "day")

生成一些测试数据,每个测试数据有四个随机错过的日期,以模拟你的da2,da3,sp2和sp3表:

library(dplyr)
set.seed(0)
da2 = data.frame(Date = sample(somedates, 27)) %>%
  mutate(hour = 2, price = 20)

set.seed(1)
da3 = data.frame(Date = sample(somedates, 27)) %>%
  mutate(hour = 3, price = 21)

set.seed(2)
sp2 = data.frame(Date = sample(somedates, 27)) %>%
  mutate(hour = 2, price = 19)

set.seed(3)
sp3 = data.frame(Date = sample(somedates, 27)) %>%
  mutate(hour = 3, price = 18)

加入da2,da3,sp2和sp3表

生成测试数据后,将表连接到完整的日期序列(作为数据框)非常简单。 (注意,我没有在下面的结果中用更有意义的版本替换已连接的列名称。)

all = 
  left_join(data.frame(Date = somedates), da2, by = "Date") %>%
  left_join(da3, by = "Date") %>%
  left_join(sp2, by = "Date") %>%
  left_join(sp3, by = "Date")

加入测试数据的结果

>all
         Date hour.x price.x hour.y price.y hour.x.x price.x.x hour.y.y price.y.y
1  2015-12-01      2      20      3      21        2        19        3        18
2  2015-12-02      2      20      3      21        2        19        3        18
3  2015-12-03     NA      NA      3      21        2        19        3        18
4  2015-12-04      2      20      3      21        2        19        3        18
5  2015-12-05      2      20      3      21        2        19        3        18
6  2015-12-06      2      20      3      21        2        19        3        18
7  2015-12-07      2      20      3      21        2        19       NA        NA
8  2015-12-08      2      20      3      21        2        19        3        18
9  2015-12-09      2      20      3      21       NA        NA        3        18
10 2015-12-10      2      20      3      21       NA        NA        3        18
11 2015-12-11      2      20      3      21        2        19        3        18
12 2015-12-12     NA      NA      3      21        2        19        3        18
13 2015-12-13      2      20     NA      NA        2        19       NA        NA
14 2015-12-14      2      20      3      21        2        19        3        18
15 2015-12-15      2      20      3      21        2        19        3        18
16 2015-12-16      2      20      3      21        2        19        3        18
17 2015-12-17      2      20      3      21        2        19        3        18
18 2015-12-18      2      20     NA      NA        2        19        3        18
19 2015-12-19     NA      NA      3      21        2        19        3        18
20 2015-12-20      2      20     NA      NA       NA        NA        3        18
21 2015-12-21      2      20      3      21        2        19        3        18
22 2015-12-22      2      20      3      21        2        19        3        18
23 2015-12-23      2      20      3      21        2        19        3        18
24 2015-12-24      2      20      3      21        2        19       NA        NA
25 2015-12-25      2      20      3      21        2        19        3        18
26 2015-12-26      2      20      3      21        2        19        3        18
27 2015-12-27      2      20      3      21        2        19        3        18
28 2015-12-28      2      20      3      21        2        19        3        18
29 2015-12-29      2      20      3      21        2        19        3        18
30 2015-12-30      2      20      3      21       NA        NA        3        18
31 2015-12-31     NA      NA     NA      NA        2        19       NA        NA

编辑我注意到您因设置加入而发布的数字日期包含0.04时间组件以及整数日期。您需要将其添加到日期序列以使联接起作用。我现在测试了这个,并且没有添加时间组件,您必须将每个日期转换为整数。这可以相当简单地完成:

da2$Date = trunc.Date(da2$Date,  "days")
da3$Date = trunc.Date(da3$Date,  "days")
sp2$Date = trunc.Date(sp2$Date,  "days")
sp3$Date = trunc.Date(sp3$Date,  "days")

在加入之前你会这样做。