我有以下数据集,它源自在不同时间点从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))
答案 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
中指定变量名称,我们告诉它在确定唯一性时仅考虑Year
和Month
中的值,因此当特定的年/月组合出现在多个数据集中时,只保留一行。
通常,distinct
仅保留用于确定唯一性的变量。通过提供参数.keep_all = TRUE
,它将保留所有变量。如果存在冲突(例如,2018年2月的两行,Dataset
的值不同),则会保留数据框中出现优先的行。这就是为什么您的新数据集首先出现在full_join
中非常重要的原因:这会使df2
行中出现的行优先于df1
中出现的行。