Обновление фреймов данных - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть следующий набор данных, который происходит из двух наборов данных, взятых из API в разные моменты времени. df1 просто показывает состояние после того, как я их добавил. Моя цель - создать самую новую версию моих данных API, не забывая старые данные. Это означает, что я ищу, чтобы создать какой-то механизм обновления. Я думал о создании уникального номера для каждого набора данных, чтобы определить его состояние, добавить новую версию к старой, а затем отфильтровать дубликаты, сохранив новые данные.

Фреймы данных выглядят так:

df (после простого добавления двух)

  "Year"    "Month"   "dataset"  
    2017    December      1
    2018    January       1 
    2018    January       2
    2018    February      1
    2018    February      2
    2018    March         2 
    2018    April         2 

df2 (обновление)

  "Year"    "Month"   "dataset"  
    2017    December      1
    2018    January       2
    2018    February      2
    2018    March         2 
    2018    April         2 

Как показывает df2, механизм обновления предпочитает данные из набора данных 2. Данные за январь и февраль были в обоих наборах данных, но сохраняются только данные за февраль.

С другой стороны, если нет совпадений между наборами данных, сохраняются старые и новые данные.

Есть ли простое решение для создания описанного механизма обновления в R?

Это код для df1:

df1 <- data.frame(Year = c(2017,2018,2018,2018,2018,2018,2018),
             Month = 
c("December","January","January","February","February","March","April"),
             Dataset = c(1,1,2,1,2,2,2))

1 Ответ

0 голосов
/ 26 апреля 2018

Дайте мне посмотреть, имею ли я это право: у вас есть 2 набора данных (названных 1 и 2), которые вы хотите объединить. В настоящее время вы получаете формат, показанный выше как df, но вы хотите, чтобы вывод был df2. Это правильно? Приведенный ниже код должен решить вашу проблему. Важно, чтобы ваш более новый набор данных появился первым в вызове full_join. Тот, кто появится первым, получит приоритет по distinct, когда решит, какие повторяющиеся строки удалить.

library(dplyr)
df <- data.frame(Year = c(2017,2018,2018,2018,2018,2018,2018),
                  Month = c("December","January","January","February",
                            "February","March","April"),
                  Dataset = c(1,1,2,1,2,2,2))
df1 <- dfx[dfx$Dataset == 1,]
df2 <- dfx[dfx$Dataset == 2,]

df.updated <- dplyr::full_join(df2, df1) %>%
    distinct(Year, Month, .keep_all = TRUE)

df.updated

  Year    Month Dataset
1 2018  January       2
2 2018 February       2
3 2018    March       2
4 2018    April       2
5 2017 December       1

full_join объединяет два фрейма данных с соответствующими переменными, сохраняя все строки из обоих. Затем distinct отбрасывает дублирующиеся строки. Указывая имена переменных в distinct, мы говорим, чтобы при определении уникальности учитывались только значения в Year и Month, поэтому, когда конкретная комбинация года / месяца появляется в более чем одном наборе данных, будет сохраняться только одна строка .

Обычно distinct сохраняет только те переменные, которые используются для определения уникальности. Предоставив аргумент .keep_all = TRUE, он сохранит все переменные. При возникновении конфликтов (например, 2 строки с февраля 2018 года с различными значениями Dataset) он будет сохраняться в зависимости от того, какая строка появляется первая в кадре данных. Вот почему важно, чтобы ваш новый набор данных отображался первым в full_join: это дает строки, которые отображаются в df2 приоритет над строками, которые также появляются в df1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...