Как объединить фреймы данных в R, используя * альтернативные * столбцы - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь объединить 2 фрейма данных в R, но у меня есть два разных столбца с разными типами переменных ID. Иногда строка будет иметь значение для одного из этих столбцов, но не для другого. Я хочу рассмотреть их оба, так что если в одном кадре отсутствует значение для одного из столбцов, будет использоваться другой.

> df1 <- data.frame(first = c('a', 'b', NA),  second = c(NA, 'q', 'r'))
> df1
first second
1     a   <NA>
2     b      q
3  <NA>      r

> df2 <- data.frame(first = c('a', NA, 'c'),  second = c('p', 'q', NA))
> df2
  first second
1     a      p
2  <NA>      q
3     c   <NA>

Я хочу объединить эти два фрейма данных и получить 2 строки:

  • строка 1, поскольку она имеет то же значение для «первого» * ​​1007 *
  • строка 2, потому что она имеет то же значение для «второй»
  • строка 3 будет удалена, потому что df1 имеет значение для «second», но не «first», а df2 имеет обратное значение

Важно, чтобы NA игнорировались и не "соответствовали" в этом случае.

Я могу немного подойти:

> merge(df1,df2, by='first', incomparables = c(NA))
  first second.x second.y
1     a     <NA>        p
> merge(df1,df2, by='second', incomparables = c(NA))
  second first.x first.y
1      q       b    <NA>

Но я не могу связать эти два фрейма данных вместе, потому что у них разные имена столбцов, и это не похоже на способ "R" (в ближайшем будущем я будет иметь 3-й, 4-й и даже 5-й тип удостоверения личности).

Есть ли менее неуклюжий способ сделать это?

Редактировать: в идеале вывод должен выглядеть следующим образом:

> df3 <- data.frame(first = c('a', 'b'), second = c('p','q'))
> df3
  first second
1     a      p
2     b      q
  • строка 1 соответствует, поскольку столбец «first» имеет одинаковое значение в обоих фреймах данных и заполняет значение «second» из df2
  • строка 2 соответствует, поскольку столбец "second" имеет одинаковое значение в обоих фреймах данных и заполняет значение "first" из df1
  • строка 3 отсутствует, поскольку в обоих фреймах данных отсутствует столбец, значение которого

1 Ответ

0 голосов
/ 31 августа 2018

Используя sqldf мы можем сделать, как в SQL мы можем чередовать условия соединения, используя OR

library(sqldf)
df <- sqldf("select a.*, b.*
               from df1 a
               join df2 b
                    ON a.first = b.first
                    OR a.second = b.second")


library(dplyr)
       #If value in first is NA i.e. is.na(first) is TRUE then use first..3 value's else use first value's and the same for second
df %>% mutate(first = ifelse(is.na(first), first..3, first),
              second = ifelse(is.na(second), second..4, second)) %>% 
       #Discard first..3 and second..4 since we no longer need them    
       select(-first..3, -second..4) 

  first second
1     a      p
2     b      q
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...