Я хотел бы знать, как добавлять новые данные (строки) из одного фрейма данных 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
Я хочу связать эти кадры данных, а не присоединиться к ним.
merge(df1, df2, all.x=TRUE)
. Он НЕ предоставляет решение, которое я хочу видеть, как объяснено в моем вопросе. - person d84_n1nj4   schedule 12.09.2016merge(df1,df2,by=c('numb','rand'),all.x=TRUE,all.y=TRUE)
- person Tensibai   schedule 12.09.2016merge(df1,df2,by=c('numb','rand'),all=TRUE)
- person Tensibai   schedule 12.09.2016