Как записать два вектора разной длины в один фрейм данных, записав одинаковые значения в одну строку? - PullRequest
8 голосов
/ 14 июля 2020

Я хочу записать два вектора разной длины с частично равными значениями в один фрейм данных. Те же значения должны быть записаны в одной строке.

ef1 <- c('A1', 'A2', 'B0', 'B1', 'C1', 'C2')
ef2 <- c('A1', 'A2', 'C1', 'C2', 'D1', 'D2')

Если я запишу их в один фрейм данных, это будет выглядеть так:

df <- data.frame (ef1, ef2)
> df
  ef1 ef2
1  A1  A1
2  A2  A2
3  B0  C1
4  B1  C2
5  C1  D1
6  C2  D2

Но я хочу вот что:

> df
  ef1 ef2
1  A1  A1
2  A2  A2
3  B0  NA
4  B1  NA
5  C1  C1
6  C2  C2
7  NA  D1
8  NA  D2

Благодарю за любую помощь.

Ответы [ 2 ]

6 голосов
/ 14 июля 2020

Один вариант: match

(tmp <- unique(c(ef1, ef2)))
# [1] "A1" "A2" "B0" "B1" "C1" "C2" "D1" "D2"

out <- data.frame(ef1 = ef1[match(tmp, ef1)],
                  ef2 = ef2[match(tmp, ef2)])

Результат

out
#   ef1  ef2
#1   A1   A1
#2   A2   A2
#3   B0 <NA>
#4   B1 <NA>
#5   C1   C1
#6   C2   C2
#7 <NA>   D1
#8 <NA>   D2
1 голос
/ 14 июля 2020

Другое решение, использующее dplyr full_join. Идея состоит в том, чтобы искусственно создать столбец слияния, а затем выполнить полное соединение.

ef1<-tibble(a=ef1,ef1=ef1)
ef2<-tibble(a=ef2,ef2=ef2)

ef1 %>% 
  full_join(ef2,by="a") %>% 
  select(ef1,ef2)

# A tibble: 8 x 2
  ef1   ef2  
  <chr> <chr>
1 A1    A1   
2 A2    A2   
3 B0    NA   
4 B1    NA   
5 C1    C1   
6 C2    C2   
7 NA    D1   
8 NA    D2 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...