2015-02-10 2 views
1

Я пытаюсь объединить данные из столбца в одном кадре данных в другой столбец во втором кадре данных, используя столбец с общими данными в качестве ключа для операции. Я пробовал несколько различных учебников о том, как реплицировать Excel vlookup в r, и я пробовал несколько разных методов слияния, представленных здесь в ответах на stackoverflow ... но пока ничего, что я пробовал, не делает именно то, м, пытаюсь сделать, хотя кажется, что это будет довольно распространенная функция.Объединить один столбец в двух кадрах данных в R, где только некоторые строки соответствуют

Так вот что я пытаюсь сделать ... чтобы обеспечить очень упрощенный пример, скажем, это dataframe1:

ID  RESULT 

4  YES 
1  YES 
3  NO 
2  YES 

И ниже dataframe2, где столбец РЕЗУЛЬТАТ полностью заселена НАН Украины, некоторые из которых будут заменены на то, что появляется в dataframe1 $ РЕЗУЛЬТАТ (есть еще много значений в dataframe2 $ ID, чем в dataframe1 $ ID, так много NAs должно остаться после слияния):

ID  RESULT 

1  NA 
8  NA 
2  NA 
9  NA 
3  NA 
6  NA 
7  NA 
4  NA 

Итак, конечный результат, который я хочу, ниже, dataframe3, где RESULT содержит YES или NO, если одно из этих значений присутствовало в dataframe1 $ RESULT или NA, где не было совпадения между идентификатором dataframe1 $ ID и dataframe2 $ ID.

ID  RESULT 

1  YES 
8  NA 
2  YES 
9  NA 
3  NO 
6  NA 
7  NA 
4  YES 

Я сумел сделать слияние с нижеследующим, который добавляет столбец (RESULT.y) в dataframe1, но он также удаляет все строки из dataframe2, которые не имеют аналогов в dataframe1:

dataframe3 <- merge(dataframe2, dataframe1, by=c("ID")) 

То, что я в конечном итоге это:

ID  RESULT.x RESULT.y 

    4  NA  YES 
    1  NA  YES 
    3  NA  NO 
    2  NA  YES 

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

dataframe3 <- merge(dataframe2, dataframe1, by=c("ID", all.x = TRUE)) 

Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column 

Помощь будет очень, очень высоко ... Я только работал в г в течение нескольких недель.

ответ

0

Вот это вы пример:

ID=c(4,1,3,2) 
RESULT=c("YES","YES","NO","YES") 
data1=data.frame(ID,RESULT) 

ID=c(1,8,2,9,3,6,7,4) 
RESULT=c("NA","NA","NA","NA","NA","NA","NA","NA") 
data2=data.frame(ID,RESULT) 

вы можете просто добавить: all=TRUE

dataframe3 <- merge(data1, data2, by=c("ID"),all=TRUE) 
+0

Большое вам спасибо - это отлично работает с моим si простой пример! В моих фактических данных второй кадр данных (один со многими строками NA) также имеет около 20 дополнительных столбцов, которые я не хочу потерять в слиянии. Есть ли удобный способ редактировать функцию, чтобы иметь другие столбцы, включенные в dataframe3, или это лучший способ просто сделать дополнительное слияние, чтобы объединить dataframe3 обратно в исходный dataframe2? – littleblue

1

Вы можете попробовать rbind и выбрать только те строки df2, которые не df1

rbind(dataframe1, dataframe2[!dataframe2$ID %in% dataframe1$ID,]) 


    ID RESULT 
1 4 YES 
2 1 YES 
3 3  NO 
4 2 YES 
21 8 <NA> 
41 9 <NA> 
6 6 <NA> 
7 7 <NA> 
+0

Я ищу аналогичное решение, но вместо этого я – tstev

Смежные вопросы