У меня есть два набора данных, которые я пытаюсь объединить. Они не являются полными наборами данных, поэтому это означает, что отдельные записи отсутствуют.
Вот data1
(пример — подмножество моих реальных данных):
squirrel_id age ageclass trialdate year OFT1 MIS1
10342 1 Y 2008-05-19 2008 0.605 -4.19
10342 2 A 2009-05-31 2009 -1.85 1.14
10342 3 A 2010-05-22 2010 -2.39 2.38
Вот data2
(пример — подмножество моих реальных данных):
squirrel_id focal_age focal_ageclass focal_date focal_yr PC1 PC2
10342 1 Y 2008-07-14 2008 0.0932 -2.67
10342 3 A 2010-03-13 2010 -2.38 0.216
10342 3 A 2010-04-20 2010 0.0203 1.80
Я пытаюсь сделать две вещи:
- объединить эти два набора данных, чтобы я сохранял NA, когда записи неполные (т. Е.
data1
имеет 1 запись вage==3
, аdata2
имеет 2 записи, когдаage==3
) - объединить столбцы, чтобы сделать набор данных более упорядоченным (т. е. столбцы с разными именами в наборах данных представляют одни и те же вещи:
age==focal_age
,ageclass==focal_ageclass
,trialnumber==focalseq
,ageclass==focal_ageclass
,year==focal_yr
)
Желаемый результат. Я пытаюсь получить окончательный набор данных, который выглядит следующим образом (где для age==3
запись data1
отображается только один раз, а не дважды):
squirrel_id age ageclass date year OFT1 MIS1 PC1 PC2
10342 1 Y 2008-05-19 2008 0.605 -4.19 NA NA
10342 1 Y 2008-07-14 2008 NA NA 0.0932 -2.67
10342 2 A 2009-05-31 2009 -1.85 1.14 NA NA
10342 3 A 2010-05-22 2010 -2.39 2.38 NA NA
10342 3 A 2010-03-13 2010 NA NA -2.38 0.216
10342 3 A 2010-04-20 2010 NA NA 0.0203 1.80
Я могу пройти здесь частично, выполнив:
data3<-full_join(data1, data2,
by=c("squirrel_id"="squirrel_id",
"year"="focal_yr",
"age"="focal_age",
"ageclass"="focal_ageclass"))
но это повторяет значения data1
для age==3
для обеих строк age==3
в data2
(вместо простого сопоставления только первой строки), что дает этот (нежелательный) вывод:
squirrel_id age ageclass trialdate focal_date year OFT1 MIS1 PC1 PC2
10342 1 Y 2008-05-19 2008-07-14 2008 0.605 -4.19 0.0932 -2.67
10342 2 A 2009-05-31 NA 2009 -1.85 1.14 NA NA
10342 3 A 2010-05-22 2010-03-13 2010 -2.39 2.38 -2.38 0.216
10342 3 A 2010-05-22 2010-04-20 2010 -2.39 2.38 0.0203 1.80
Обновленный вопрос: Как сделать, чтобы совпадающие записи добавляли NA для всех строк при выполнении full_join
? Обратите внимание, что я бы предпочел решение dplyr
, так как я не работаю в data.table
(например, ответ на этот OP), и я хочу сохранить строки, которые не совпадают (в отличие от этот другой OP).