我有以下数据集,它源自在不同时间点从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))
让我看看我是否有这个权利:你有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
,它将保留所有变量。当存在冲突时(例如,2018年2月的2行具有不同的Dataset
值),它将保留数据框中首先出现的行。这就是为什么新的数据集首先出现在full_join
中很重要的原因:这使得df2
中出现的行优先于df1
中出现的行。