更新数据框

时间:2018-04-26 13:20:48

标签: r tidyverse

我有以下数据集,它源自在不同时间点从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中的数据。1月和2月的数据都在两个数据集中,但只保留了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 :(得分:1)

让我看看我是否拥有此权利:您有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中指定变量名称,我们告诉它在确定唯一性时仅考虑YearMonth中的值,因此当特定的年/月组合出现在多个数据集中时,只保留一行。

通常,distinct仅保留用于确定唯一性的变量。通过提供参数.keep_all = TRUE,它将保留所有变量。如果存在冲突(例如,2018年2月的两行,Dataset的值不同),则会保留数据框中出现优先的行。这就是为什么您的新数据集首先出现在full_join中非常重要的原因:这会使df2行中出现的行优先于df1中出现的行。