更新数据框

问题描述 投票:0回答:1

我有以下数据集,它源自在不同时间点从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))
r tidyverse
1个回答
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月的2行具有不同的Dataset值),它将保留数据框中首先出现的行。这就是为什么新的数据集首先出现在full_join中很重要的原因:这使得df2中出现的行优先于df1中出现的行。

© www.soinside.com 2019 - 2024. All rights reserved.