2017-11-09 15 views
3

私は2台のマシンで製品のさまざまな面を検査しています。だから私はIDを生成する2つのシステムを持つ2つのデータセットを持っていますが、IDは同じ製品が検査されることを指しています。そして、両方のシステムのIDが10個の製品ごとにリセットされます。時にはシステムの1つが間違っていて、IDが生成されていないか、間違ったIDが生成されましただから、データセットは次のようになります。R:2つのdata.frameを1つにマージして一致する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 

私はこの問題は、IDのリセット自体ごとに10の製品ということで、いくつかのマージ機能を試してみました。一致する一意のIDはありません。私がmerge()関数から得た結果はすべて乱れています。 実際のデータセットは、通常、1回の実行で> 10,000行のデータを保持します。これらの問題を1行ずつ取り出すことは不可能です。 誰か助けてもらえますか?ありがとう。

+0

マージする独自のIDを作成してみることもできます。 "ID1"列の累積合計と2番目のデータセットの "ID2"列の累積合計と等しい "ID"という各データセット内に列を作成します。 –

+0

IDが「0」または「n/a」の場合、ラグ変数を作成してIDがないかゼロに等しい場合は、ラグ変数+ 1の値を割り当てます。 –

+0

こんにちは、cody_stinsonあなたの返信、私は元のIDに基づいて累積和の一意のIDを作成するのポイントを持っていますが、私はまだこれらの間違ったIDが壊れて累積IDを混乱させる、遅れを作成するのポイントを取得していません。より詳細な例を教えてください。ありがとう! –

答えて

0

私のアプローチはあなたのように見えるように生成したサンプルデータを使用しています。私のサンプルデータでは、 "n/a"はNAとしてコード化されていますので、完全に一致させたい場合は、欠損値(NA)に "n/a"の出現を再コードします。

まず私は、パッケージ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(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 

そして第二:

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 

今すぐdplyrを使用してラグ変数を作成しますが、他の関数を使用してラグ変数を作成することもできます。 2番目のデータセットにはミスヒットしかないので、2番目のデータセットにステップを適用しますが、1番目のデータセットも複製できます。

また、データにあるような2つの連続する欠損値がある場合、ラグ変数は完全に機能しません。すべてのミスが処理されるまで、プロセスを実行するための "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 
関連する問題