2017-09-28 13 views
2

に被写体IDと一致するシーケンスIDによって2つのデータセットを結合私は単一のものに参加する2つのデータセットがあります両方のデータセットは、最初の列と同じsubjectを有するをdplyr

set.seed(111) 
dat1 = data.frame(subject = paste0("A-",c(1,1,2,2,3,3,3,4,4,5)), 
        seq1 = c(2, 3, 7, 8, 2, 9, 11, 10, 11, 16), 
        text1 = sample(LETTERS, 10)) 
dat1 

    subject seq1 text1 
1  A-1 2  P 
2  A-1 3  S 
3  A-2 7  I 
4  A-2 8  L 
5  A-3 2  X 
6  A-3 9  V 
7  A-3 11  A 
8  A-4 10  K 
9  A-4 11  H 
10  A-5 16  B 

set.seed(999) 
dat2 = data.frame(subject = paste0("A-", c(1,1,1,2,2,3,3,3,4,5,5,5,5)), 
        seq2 = c(2, 3, 4, 7, 8, 2, 9, 11, 10, 16, 17, 18, 19), 
        text2 = sample(LETTERS, 13)) 
dat2 
     subject seq2 text2 
1  A-1 2  K 
2  A-1 3  O 
3  A-1 4  C 
4  A-2 7  T 
5  A-2 8  R 
6  A-3 2  X 
7  A-3 9  M 
8  A-3 11  B 
9  A-4 10  H 
10  A-5 16  Z 
11  A-5 17  E 
12  A-5 18  I 
13  A-5 19  A 

が、しかし(seq1は2と3を有する)が、dat2には、同じ対象A-1が3つのレコードを有する(seq2は2と3とを有する)、subjectの観測数は異なる可能性がある(例えば、dat1で、対象A-私は、同じ行に一意のシーケンス番号(seq1と)を保持しながら、結合されたデータセットに両方のデータセットのすべてのサブジェクトを含めることを希望します。 seq2)に対応するtext1およびtext2である。 1つのデータセットに1つの配列IDが欠落していても、他のデータセットに同じ配列IDがある場合は、NAを割り当てます。

最終データセットは次のようになります。ご覧のとおり、参加したデータセットは、同じsubjectで同じseq1seq2を持って

# subject seq1 text1 seq2 text2 
# 1  A-1 2  P 2  K 
# 2  A-1 NA NA 4  C 
# 3  A-1 3  S 3  O 
# 4  A-2 7  I 7  T 
# 5  A-2 8  L 8  R 
# 6  A-3 2  X 2  X 
# 7  A-3 9  V 9  M 
# 8  A-3 11  A 11  B 
# 9  A-4 10  K 10  H 
# 10  A-4 11  H NA  NA 
# 11  A-5 16  B 16  Z 
# 12  A-5 17  E NA  NA 
# 13  A-5 18  I NA  NA 
# 14  A-5 19  A NA  NA 

、および欠落しているシーケンスIDの場合(どちらかseq1またはseq2中) 、NAが割り当てられます。このタスクにdplyrを利用していただきありがとうございます!

答えて

5

Iは、配列と呼ばれる各データセット内の新しい列を作り、次いで

full_join(mutate(dat1, seq = seq1), 
      mutate(dat2, seq = seq2)) %>% 
    arrange(subject, seq) %>% 
    select(-seq) 
2


library(dplyr) 
set.seed(111) 
dat1 = tibble(subject = paste0("A-",c(1,1,2,2,3,3,3,4,4,5)), 
        seq1 = c(2, 3, 7, 8, 2, 9, 11, 10, 11, 16), 
        text1 = sample(LETTERS, 10)) 
dat1 

#> # A tibble: 10 x 3 
#> subject seq1 text1 
#>  <chr> <dbl> <chr> 
#> 1  A-1  2  P 
#> 2  A-1  3  S 
#> 3  A-2  7  I 
#> 4  A-2  8  L 
#> 5  A-3  2  X 
#> 6  A-3  9  V 
#> 7  A-3 11  A 
#> 8  A-4 10  K 
#> 9  A-4 11  H 
#> 10  A-5 16  B 


set.seed(999) 
dat2 = tibble(subject = paste0("A-", c(1,1,1,2,2,3,3,3,4,5,5,5,5)), 
        seq2 = c(2, 3, 4, 7, 8, 2, 9, 11, 10, 16, 17, 18, 19), 
        text2 = sample(LETTERS, 13)) 


dat1 <- dat1 %>% mutate(id = seq1) 
dat2 <- dat2 %>% mutate(id = seq2) 


dat1 %>% 
    full_join(dat2, by = c("subject", "id")) %>% 
    arrange(subject, id) %>% 
    select(-id) 

#> # A tibble: 14 x 5 
#> subject seq1 text1 seq2 text2 
#>  <chr> <dbl> <chr> <dbl> <chr> 
#> 1  A-1  2  P  2  K 
#> 2  A-1  3  S  3  O 
#> 3  A-1 NA <NA>  4  C 
#> 4  A-2  7  I  7  T 
#> 5  A-2  8  L  8  R 
#> 6  A-3  2  X  2  X 
#> 7  A-3  9  V  9  M 
#> 8  A-3 11  A 11  B 
#> 9  A-4 10  K 10  H 
#> 10  A-4 11  H NA <NA> 
#> 11  A-5 16  B 16  Z 
#> 12  A-5 NA <NA> 17  E 
#> 13  A-5 NA <NA> 18  I 
#> 14  A-5 NA <NA> 19  A 
FULL_JOINを使用