R:如何将两个data.frame合并为一个,同时匹配的ID重复出现,有时丢失

R:如何将两个data.frame合并为一个,同时匹配的ID重复出现,有时丢失,r,dataframe,merge,statistics,match,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

我有两台机器检查产品的不同方面。因此,我有两组数据,两个系统生成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
  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
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
数据集1:数据集2:
时间戳1 ID1值1时间戳2 ID2值2
上午9时01分10.19时02分110
上午9:03 20.8上午9:04 215
上午9:05 30.19:07上午3:10

上午9:09 40.1上午9:11 0 n/a以下是我的方法,使用我生成的一些样本数据,看起来像你的。在我的示例数据中,“n/a”被编码为NA,因此如果您想要完美匹配,我会将出现的“n/a”重新编码为缺失值(NA)

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

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(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
头部(df2,11)
时间2 ID2值2
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不适用
6娜娜
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
现在我使用dplyr来创建一个滞后变量,但是您可以使用其他函数来创建滞后变量。因为第二个数据集中只有缺失,所以我只将这些步骤应用于第二个数据集中,尽管您也可以将其复制到第一个数据集中

此外,当数据中有两个连续的缺失值时,lag变量将无法完全工作。我添加了一个“while循环”来运行这个过程,直到处理完所有的丢失

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

### Add lag variable to create unique ID ###
while (sum(is.na(df2$ID2)) > 0) {
df2 <- df2 %>% 
  mutate(ID2_lag = lag(ID2)) %>% 
  mutate(ID2 = ifelse(is.na(ID2), ID2_lag + 1, ID2)) %>% 
  select(-ID2_lag)
}

### Create unique ID
df1$ID <- cumsum(df1$ID1)
df2$ID <- cumsum(df2$ID2)

### Merge ###
df <- full_join(df1, df2) %>% 
  select(ID, ID1, ID2, time1, time2, value1, value2)

head(df, 11)
   ID ID1 ID2               time1               time2 value1 value2
1   1   1   1 2017-11-10 09:59:33 2017-11-10 09:59:33    0.4     15
2   3   2   2 2017-11-10 09:59:35 2017-11-10 09:59:36    0.7     15
3   6   3   3 2017-11-10 09:59:37 2017-11-10 09:59:39    0.6     18
4  10   4   4 2017-11-10 09:59:39 2017-11-10 09:59:42    0.5     18
5  15   5   5 2017-11-10 09:59:41 2017-11-10 09:59:45    0.3     NA
6  21   6   6 2017-11-10 09:59:43                <NA>    0.9     NA
7  28   7   7 2017-11-10 09:59:45 2017-11-10 09:59:51    0.6     14
8  36   8   8 2017-11-10 09:59:47 2017-11-10 09:59:54    0.6     16
9  45   9   9 2017-11-10 09:59:49 2017-11-10 09:59:57    0.5     13
10 55  10  10 2017-11-10 09:59:51 2017-11-10 10:00:00    0.8     13
11 56   1   1 2017-11-10 09:59:53 2017-11-10 10:00:03    0.5     15
###添加滞后变量以创建唯一ID###
而(总和(is.na(df2$ID2))>0){
df2%
突变(ID2_滞后=滞后(ID2))%>%
突变(ID2=ifelse(is.na(ID2),ID2_lag+1,ID2))%>%
选择(-ID2\U滞后)
}
###创建唯一ID

df1$ID您可以尝试创建自己的唯一ID进行合并。在每个数据集中创建一个名为“ID”的列,该列等于第二个数据集中“ID1”列和“ID2”列的累积和。对于ID为“0”或“n/a”的,可以创建一个滞后变量,然后如果ID缺失或等于零,则为其分配一个滞后变量+1Hi,cody_stinson的值,感谢您的回复,我在原始ID的基础上得到了创建累积和唯一ID的点,但我仍然没有得到创建滞后变量的点,这些错误的ID将破坏并弄乱累积ID。您能给出一个更详细的示例吗?谢谢