【问题标题】:Updating Data Frames更新数据框
【发布时间】:2018-04-26 13:20:48
【问题描述】:

我有以下数据集,它源自在不同时间点取自 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))

【问题讨论】:

  • 你到底想要什么?您想要两个数据集 - 重复数据集和重复数据集吗?
  • dplyr::right_join(df, df2) 能解决您的问题吗?

标签: r tidyverse


【解决方案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 值),它将保留数据框中 first 出现的任何行。这就是为什么您的新数据集首先出现在 full_join 中很重要的原因:这使出现在 df2 中的行优先于也出现在 df1 中的行。

【讨论】:

  • 谢谢你,这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2017-08-26
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多