Условное объединение нескольких таблиц с перезаписью вместо создания новых столбцов - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть три фрейма данных, к которым я пытаюсь присоединиться. Сложность в том, что я хочу заменить конфликтующие значения в одном столбце вместо создания новой строки. Я пробовал различные варианты left_join и full_join с последующим фильтром.

Пример фрейма данных:

df.0 <- 
 ID SEQUENCE    FIXDT.0 FIXU.0           SEX
  3        0 2010-08-01        Spayed Female
  1        0 2011-10-01        Neutered Male
  2        0                1  Spayed Female
  5        0 2012-05-01        Neutered Male

df.1_2 <- 
 ID SEQUENCE    FIXDT.0 FIXU.0           SEX
  3        1 2010-10-01        Spayed Female
  1        1                1  Neutered Male
  4        2                1  Spayed Female
  5        1 2012-05-01        Neutered Male

df.3_6 <-
 ID SEQUENCE    FIXDT.0 FIXU.0           SEX
  6        3 2011-08-01        Neutered Male
  1        6 2012-10-01        Neutered Male
  4        4 2010-02-01        Spayed Female
  5        3 2012-05-01        Neutered Male

df.cohort <-
 ID    SEX.STATUS   BIRTH.DATE  ENROLLED.DATE
  1  Neutered Male  8/23/2010    12/11/2012
  2  Spayed Female  6/16/2011     9/11/2013
  3  Spayed Female  9/28/2011      9/6/2013 
  4  Spayed Female  6/26/2011      1/2/2013
  5  Neutered Male  4/15/2011      7/5/2012
  6  Neutered Male  5/12/2010     8/16/2011
  7  Intact Male    2/17/2011    10/25/2012

Я хочу объединить их вместе с желаемым выводом ниже. Идея заключается в том, что я объединяю их вместе и заменяю предыдущие значения значениями из следующей таблицы. Другая важная вещь, на которую следует обратить внимание, это то, что я хочу указать дату выхода FIXDT, если это возможно. Это будет означать замену для некоторых строк, но не для других

df.full <-
 ID    SEX.STATUS   BIRTH.DATE  ENROLLED.DATE            Sex   FIXDT       FIXU  SEQUENCE
  1  Neutered Male  8/23/2010    12/11/2012    Neutered Male   2011-10-01              0
  2  Spayed Female  6/16/2011     9/11/2013    Spayed Female                 1         0
  3  Spayed Female  9/28/2011      9/6/2013    Spayed Female   2010-08-01              0
  4  Spayed Female  6/26/2011      1/2/2013    Spayed Female   2010-02-01              4
  5  Neutered Male  4/15/2011      7/5/2012    Neutered Male   2012-05-01              0
  6  Neutered Male  5/12/2010     8/16/2011    Neutered Male   2011-08-01              3
  7  Intact Male    2/17/2011    10/25/2012    

Я знаю, что для этой марки требуются некоторые промежуточные данные.фреймы, и я тоже пытался обойти это. Я попытался использовать dplyr и filter, но понял, что они лучше всего подходят для равных объединений, и я пытаюсь сделать неравное объединение.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Я попытался использовать код в ответе выше после некоторой очистки данных. Однако лучше всего получился пошаговый ответ.

1) Объедините каждое значение df с когортой, а затем поднабор, чтобы оставить только одну собаку, использующую разных. Например, с df.1_2:

df.1_2_join <- left_join(df.1_2, cohort, by="DOGID")
df.1_2_join <- df.1_2_join[order(df.1_2_join$SEQUENCE),]
df.1_2_join <- df.1_2_join %>% distinct(DOGID, .keep_all = TRUE)

2), чтобы все соответствующие имена столбцов совпадали.

3) сделать full_join по всем столбцам

4) упорядочить полный data.frame по Sequence и снова использовать Different для удаления дублированных идентификаторов

В процессе я также узнал, что duplicated2 - это полезная функция для записи списка всех дублированных строк в кадре данных,не только их 2,3 или более внешности. Я использовал это, чтобы проверить и убедиться, что все идентификаторы не были продублированы и имели правильную информацию.

0 голосов
/ 06 ноября 2019

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

library('dplyr')

special_join <- function(x, y, by, ...) {

    shared_cols <- colnames(x) [colnames(x) %in% colnames(y) & !colnames(x) %in% by]
    x[,shared_cols] <- NULL                                                                                                        

    full_join(x, y, by, ...)

}

a <- data.frame(ID = 1:4, variable=c('a', 'b', 'c', 'd'), other_variable=4:7)                                                      
b <- data.frame(ID = 1:3, variable=c('z', 'x', 'y'))

special_join(a, b, by='ID')
#   ID other_variable variable                                                                                                       
# 1  1              4        z                                                                                                     
# 2  2              5        x
# 3  3              6        y                                                                                                      
# 4  4              7     <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...