R:如何将两个data.frame合并为一个匹配ID重复自身并且有时会丢失的数据

时间:2017-11-09 21:22:33

标签: r dataframe merge statistics match

我有两台机器检查产品的不同方面。所以我有两组数据,两个系统生成ID,但ID指的是相同的产品被检查。并且两个系统中的ID每10个被检查的产品重置一次。有时其中一个系统出错并且没有生成ID或错误的ID。所以数据集如下所示:

 data set 1:                         data set 2:
 timestamp1    ID1    value1         timestamp2    ID2   value2
 9:01 am        1        0.1             9:02 am    1      10
 9:03 am        2        0.8             9:04 am    2      15
 9:05 am        3        0.1             9:07 am    3      10
 9:09 am        4        0.1             9:11 am    0      n/a   <-system wrong
 9:11 am        5        0.1             9:15 am    6      17    ID 4&5 missing
 9:13 am        6        0.1             9:16 am    7      10

 ...................... .....data continues

 9:21 am        9        0.1             9:22 am     10     19
 9:22 am        10        0.1            9:23 am     1      10 <- ID back to 1
 9:23 am        1        0.1             9:24 am     2      10
 9:01 am        2        0.1             9:25 am     3      10

我想将两个数据集合并为一个,所以我有两个系统&#39;同一产品的检验值。预期的数据集应如下所示:

  timestamp1    ID1    value1    timestamp2  ID2   value2
  9:01 am        1        0.1      9:02 am    1      10
  9:03 am        2        0.8      9:04 am    2      15
  9:05 am        3        0.1      9:07 am    3      10
  9:09 am        4        0.1      9:11 am   n/a     n/a   <-system wrong
  9:11 am        5        0.1        n/a     n/a     n/a
  9:13 am        6        0.1      9:15 am    6      17
  9:14 am        7        0.1      9:16 am    7      10

   ..................data continues

  9:23 am        1        0.1      9:23 am    1      10 <- ID back to 1
  9:01 am        2        0.1      9:25 am    2      10

我尝试了几个合并功能,问题是ID每10个产品重置一次。没有唯一的ID可供匹配,我从merge()函数得到的结果都搞砸了。 实际数据集通常具有&gt;每次生产运行10,000行数据。逐行挑选出这些问题是不可能的。 任何人都能提供一些帮助吗?感谢。

1 个答案:

答案 0 :(得分:0)

这是我的方法,使用我生成的一些样本数据看起来像你的。在我的示例数据中,&#34; n / a&#34;被编码为NA,所以如果你想完美匹配,我会重新编码&#34; n / a&#34;缺失值(NA)。

首先,我加载包dplyr并创建一些示例数据:

$('.postoption').click(function(){
    $(this).find('i').toggleClass('fa-star-o fa-star');
    $(this).find('i').toggleTitle('Favorite This Post *OR* Remove Favorite')
});

第一个数据集的预览如下所示:

library(dplyr)

### Create some example data ###
time <- Sys.time()
time_seq1 <- seq(time, time + 40, 2)
time_seq2 <- seq(time, time + 40, 3)

id <- rep(seq(1, 10, 1), 3)
id1 <- id[1:length(time_seq1)]
id2 <- id[1:length(time_seq2)]

df1 <- data.frame(time1 = time_seq1, 
                  ID1 = id1,
                  value1 = round(rnorm(length(time_seq1), 0.5, 0.2),1))

df2 <- data.frame(time2 = time_seq2, 
                  ID2 = id2,
                  value2 = round(rnorm(length(time_seq2), 15, 2),0))

df2[5, 2:3] <- NA
df2[6, ]    <- NA

第二个:

head(df1, 11)
                 time1 ID1 value1
1  2017-11-10 10:18:07   1    0.6
2  2017-11-10 10:18:09   2    0.4
3  2017-11-10 10:18:11   3    0.4
4  2017-11-10 10:18:13   4    0.7
5  2017-11-10 10:18:15   5    0.4
6  2017-11-10 10:18:17   6    0.1
7  2017-11-10 10:18:19   7    0.8
8  2017-11-10 10:18:21   8    0.5
9  2017-11-10 10:18:23   9    0.5
10 2017-11-10 10:18:25  10    0.7
11 2017-11-10 10:18:27   1    0.1

现在我使用dplyr创建滞后变量,但您可以使用其他函数来创建滞后变量。因为第二个数据集中只有缺失,所以我只将步骤应用于第二个数据集,尽管您也可以为第一个数据集复制它。

此外,当您的数据中存在两个连续缺失值时,滞后变量将无法完全正常工作。我添加了一个&#34; while循环&#34;运行过程直到所有错过都被处理。

最后,我创建了唯一的ID并将它们合并在一起。

head(df2, 11)
                 time2 ID2 value2
1  2017-11-10 10:18:07   1     14
2  2017-11-10 10:18:10   2     16
3  2017-11-10 10:18:13   3     15
4  2017-11-10 10:18:16   4     19
5  2017-11-10 10:18:19  NA     NA
6                 <NA>  NA     NA
7  2017-11-10 10:18:25   7     17
8  2017-11-10 10:18:28   8     14
9  2017-11-10 10:18:31   9     13
10 2017-11-10 10:18:34  10     13
11 2017-11-10 10:18:37   1     14