Как привязать новые строки из одного фрейма данных к существующему фрейму данных в R

Я хотел бы знать, как добавлять новые данные (строки) из одного фрейма данных df2 в существующий фрейм данных df1 на основе уникального значения в каждой таблице. Итак, у меня есть существующий фрейм данных df1, в котором есть исторические данные, и каждая строка имеет уникальное значение. Затем я извлекаю данные из Интернета и помещаю их в новый фрейм данных, df2. Новый фрейм данных также включает уникальное значение, которое может совпадать или не совпадать с уникальным значением в df1.

Я хотел бы взять все строки в df2, которые имеют уникальное значение, которого нет в df1, и добавить эти строки в df1. Моими первоначальными мыслями было использовать код, подобный этому:

ifelse(any(df1$unique_val==df2$unique_val), df1 <- df1, df1 <- rbind(df2, df1))

Но потом я понял, что мне нужен матч один на один, а не "любой". Я знаю, как бы я сделал это в SQL с предложением UNION и WHERE, но я не уверен, как заставить его работать в R. Единственные связанные элементы, которые я мог найти, это добавление всех данных из двух фреймов данных или добавление нового столбец в существующий фрейм данных.

В следующем примере показано, что я ищу и почему я не хочу «объединять» эти два фрейма данных.

df1 = data.frame(numb = c(1:6), rand = c(rep("Toaster",6)))

df1$unique_val <- paste0(df1$numb, df1$rand)

> df1 numb rand unique_val 1 1 Toaster 1Toaster 2 2 Toaster 2Toaster 3 3 Toaster 3Toaster 4 4 Toaster 4Toaster 5 5 Toaster 5Toaster 6 6 Toaster 6Toaster

df2 = data.frame(numb = c(5:7), rand = c(rep("Toaster",2), c(rep("Radio",1))))

df2$unique_val <- paste0(df2$numb, df2$rand)

> df2 numb rand unique_val 1 5 Toaster 5Toaster 2 6 Toaster 6Toaster 3 7 Radio 7Radio

Как видите, строка 3 в df2 является единственной новой строкой (строка, которая не имеет соответствующего уникального значения в df1). Я хотел бы добавить эту новую строку в df1. Примечание: это не всегда одна и та же строка, новая в df2.

Я использовал каждое из соединений из этого сообщения, merge/ присоединяйте фреймы данных следующим образом:

merge(df1,df2, by = "unique_val")

merge(df1,df2, by = "unique_val", all = TRUE)

merge(df1,df2, by = "unique_val", all.x = TRUE)

merge(df1,df2, by = "unique_val", all.y = TRUE)

Я также попробовал anti_join от dplyr:

anti_join(df1,df2, by = "unique_val")

Rbind дает мне следующее:

rbind(df1,df2) numb rand conc 1 1 Toaster 1Toaster 2 2 Toaster 2Toaster 3 3 Toaster 3Toaster 4 4 Toaster 4Toaster 5 5 Toaster 5Toaster 6 6 Toaster 6Toaster 7 5 Toaster 5Toaster 8 6 Toaster 6Toaster 9 7 Radio 7Radio

Ни один из них не дает мне желаемого результата:

numb rand conc 1 1 Toaster 1Toaster 2 2 Toaster 2Toaster 3 3 Toaster 3Toaster 4 4 Toaster 4Toaster 5 5 Toaster 5Toaster 6 6 Toaster 6Toaster 7 7 Radio 7Radio

Я хочу связать эти кадры данных, а не присоединиться к ним.


person d84_n1nj4    schedule 12.09.2016    source источник
comment
Как насчет использования уникального (rbind (df1, df2))???   -  person Lourdes Hernández    schedule 12.09.2016
comment
Привет @Cath, @akrun решил мое решение. Я не задавал тот же вопрос снова - я предоставил гораздо больше подробностей, как объясняет этот веб-сайт, если вы не думаете, что это дублирующий вопрос, который я до сих пор не считаю дублирующим. Полностью прочитайте мой вопрос и используйте merge(df1, df2, all.x=TRUE). Он НЕ предоставляет решение, которое я хочу видеть, как объяснено в моем вопросе.   -  person d84_n1nj4    schedule 12.09.2016
comment
@d84_n1nj4 Просто выполните полное соединение: merge(df1,df2,by=c('numb','rand'),all.x=TRUE,all.y=TRUE)   -  person Tensibai    schedule 12.09.2016
comment
исправление: внешнее соединение, а синтаксис можно упростить: merge(df1,df2,by=c('numb','rand'),all=TRUE)   -  person Tensibai    schedule 12.09.2016


Ответы (1)


Мы можем использовать rbindlist/unique из data.table. Мы помещаем наборы данных в list, используем rbindlist (из data.table), чтобы связать наборы данных в list с одним data.table и получаем unique строк с unique из data.table, у которого также есть опция by для указания переменной.

library(data.table)
unique(rbindlist(list(df1, df2)), by = "numb")
#   numb    rand unique_val
#1:    1 Toaster   1Toaster
#2:    2 Toaster   2Toaster
#3:    3 Toaster   3Toaster
#4:    4 Toaster   4Toaster
#5:    5 Toaster   5Toaster
#6:    6 Toaster   6Toaster
#7:    7   Radio     7Radio
person akrun    schedule 12.09.2016
comment
Не мой голос (и я не буду голосовать здесь), но я думаю, что это может быть связано с этим метапостом. С моей точки зрения, ваш ответ, хотя и правильный, просто отбрасывает кучу функций без какого-либо объяснения того, как это работает/решает проблему. Это делает его бесполезным для будущих читателей, так как им будет трудно понять, что к чему, так что это бесполезно, на мой взгляд (и я предполагаю, что и чье-то мнение тоже). - person Tensibai; 12.09.2016
comment
Вы просили разъяснений, я лишь высказал свою точку зрения по этому поводу. Я просто добавил точности, потому что не могу говорить за кого-то другого. - person Tensibai; 12.09.2016
comment
OP слишком длинный для меня, чтобы читать, но это может иметь значение (поскольку тот же ответ, кажется, подходит): stackoverflow.com/q /39398135 (Почти наверняка не обман, так как OP хотел получить ответы на конкретные пакеты.) - person Frank; 12.09.2016
comment
@Frank Это похоже на обман. я отмечу это - person akrun; 12.09.2016