提问人:user22757672 提问时间:11/10/2023 最后编辑:jay.sfuser22757672 更新时间:11/14/2023 访问量:42
如何根据除一列以外的所有列识别删除重复项?
How to identify remove duplicates based on all columns except for one?
问:
我有类似于以下数据框的数据,想要根据除日期之外的所有列查找重复项,使用排除的列(日期)来确定要删除的行(仅保留最近的日期)。在不丢失列的情况下完成所有这些操作。
ID Fn Ln date
1 1 Joe Schmoe 2001-01-01
2 1 Joe Schmoe 2010-01-01
3 6 Joe Schmoe 2001-01-01
4 2 Stacy Fakename 2002-02-02
5 2 Stacy Fakename 2020-02-02
6 3 Craig Collins 2030-03-03
7 3 Craig Collins 2003-03-03
8 4 Leo Fern 2040-04-04
9 4 Leo Fern 2004-04-04
10 5 Penny Diamond 2005-05-05
11 5 Penny Diamond 2050-05-05
因此,Joe Schmoe 三行的代码应该发现只有两行相同。一个因身份证不同而被取消资格,其余两个相同,除了 2010 年应保留的日期。
我最终希望将 Joe ID 6 和最近的副本(Joe ID 1 Date 2010)等唯一文件保留在同一表中,删除旧的重复项(Joe ID 1 Date 2001)。
数据
data <- data.frame(ID=c(1, 1, 6, 2, 2, 3, 3, 4, 4, 5, 5),
Fn=c("Joe", "Joe", "Joe", "Stacy", "Stacy", "Craig", "Craig", "Leo", "Leo", "Penny", "Penny"),
Ln=c("Schmoe", "Schmoe", "Schmoe", "Fakename", "Fakename", "Collins", "Collins", "Fern", "Fern", "Diamond", "Diamond"),
date=c("2001-01-01", "2010-01-01", "2001-01-01", "2002-02-02", "2020-02-02", "2030-03-03", "2003-03-03", "2040-04-04", "2004-04-04", "2005-05-05", "2050-05-05")
)
答:
1赞
jay.sf
11/10/2023
#1
对于每个 ID,创建一个向量,该向量给出日期的底层结构,这可以通过 轻松完成。要确保您有日期,请使用 .最后,简单地为 sts 子集。order
integer
ave
as.Date(date)
1
> subset(data, ave(-as.integer(as.Date(date)), ID, FUN=order) == 1L)
ID Fn Ln date
2 1 Joe Schmoe 2010-01-01
3 6 Joe Schmoe 2001-01-01
5 2 Stacy Fakename 2020-02-02
6 3 Craig Collins 2030-03-03
8 4 Leo Fern 2040-04-04
11 5 Penny Diamond 2050-05-05
数据:
data <- data.frame(
ID = c(1, 1, 6, 2, 2, 3, 3, 4, 4, 5, 5),
Fn = rep(c("Joe", "Stacy", "Craig", "Leo", "Penny"), rep(3:2, c(1L, 4L))),
Ln = rep(c("Schmoe", "Fakename", "Collins", "Fern", "Diamond"), rep(3:2, c(1L, 4L))),
date = c(
"2001-01-01", "2010-01-01", "2001-01-01", "2002-02-02", "2020-02-02",
"2030-03-03", "2003-03-03", "2040-04-04", "2004-04-04", "2005-05-05",
"2050-05-05"
)
)
评论
0赞
user22757672
11/10/2023
因此,实际数据大约有 18 列需要匹配。仅靠 ID 是无法做到的。我需要代码来读取所有其他列(在本例中为 ID、fn、ln)以定义重复项。那么,如果我用 c(第 1-18 列)替换 ID,那会起作用吗?
0赞
jay.sf
11/10/2023
@user22757672 您是否在真实数据上尝试过代码?
0赞
user22757672
11/10/2023
是的,它似乎有效,但我想理解并确保代码正在执行我的意图。假设有两个 Joe Schmoes,他们唯一不同的是他们的 dobs,但他们加入的日期不同。恐怕如果这段代码没有超过他们的 ID,那么一个人可能会被删除。或者更有可能的是,在此步骤中,同一个人有多行,因为他们有多个已更新的联系人。如果仅检查 id,则会称它们为重复项,但这些行包含电子邮件和电话,并且根据联系人行而有所不同。
0赞
jay.sf
11/10/2023
@user22757672很好。您可能需要阅读以了解该函数的实际作用,即按 ID(第二个)和返回(参数)对日期(第一个参数)进行分组。 因此,on 仅保留最近的日期(按 ID)。ID 应该与 Fn、Ln 和您提到的其他内容唯一对应。?ave
order
FUN=
subset
== 1
1赞
user22757672
11/10/2023
第一个像魅力一样工作,谢谢你的帮助
评论