在下面的SO帖子中如何识别 R 中行的部分重复项 https://stackoverflow.com/questions/54661129/how-to-identify-partial-duplicates-of-rows-in-r#54661129,我问如何删除部分重复的行。这是我问的:
我想识别数据框中行的“部分”匹配。具体来说,如果数据框中的特定行基于列子集之间的匹配在数据框中的其他位置具有重复行,我想创建一个值为 1 的新列。增加的复杂性是数据框中的一列是数字,如果绝对值匹配,我想匹配。
问题是,我需要确保当一行被识别为部分重复时,只有当属于匹配的列之一是镜像相反值而不仅仅是绝对值的匹配时,才会如此。为了让事情更清楚,这是上一篇文章中的示例数据:
name<-c("Richard Nixon", "Bill Clinton", "George Bush", "Richard Nixon")
state<-c("California", "Indiana", "Florida", "California")
num<-c("-258", "123", "42", "258")
date<-c("day 2", "day 15", "day 3","day 45")
(df<-as.data.frame(cbind(name,state,num, date)))
name state num date
1 Richard Nixon California -258 day 2
2 Bill Clinton Indiana 123 day 15
3 George Bush Florida 42 day 3
4 Richard Nixon California 258 day 45
这是我上一篇文章的解决方案:
df$absnum = abs(as.numeric(as.character(df$num)))
df$newcol = duplicated(df[,c('name','state', 'absnum')]) |
duplicated(df[,c('name','state', 'absnum')], fromLast = T)
# name state num date absnum newcol
# 1 Richard Nixon California -258 day 2 258 TRUE
# 2 Bill Clinton Indiana 123 day 15 123 FALSE
# 3 George Bush Florida 42 day 3 42 FALSE
# 4 Richard Nixon California 258 day 45 258 TRUE
请注意,第 1 行和第 4 行已标记TRUE
under newcol
,这很好。这是新的示例数据,但增加了复杂性问题:
name<-c("Richard Nixon", "Bill Clinton", "George Bush", "Richard Nixon", "Bill
Clinton")
state<-c("California", "Indiana", "Florida", "California", "Indiana")
num<-c("-258", "123", "42", "258", "123")
date<-c("day 2", "day 15", "day 3","day 45", "day 100")
(df<-as.data.frame(cbind(name,state,num, date)))
name state num date
1 Richard Nixon California -258 day 2
2 Bill Clinton Indiana 123 day 15
3 George Bush Florida 42 day 3
4 Richard Nixon California 258 day 45
5 Bill Clinton Indiana 123 day 100
请注意,观察值 2 和 5 是部分重复的,但与 1 和 4 的方式不同。我需要申请TRUE
仅适用于绝对值匹配但不匹配原始值的那些观测值。所以我希望结果返回以下内容:
name state num date newcol
1 Richard Nixon California -258 day 2 TRUE
2 Bill Clinton Indiana 123 day 15 FALSE
3 George Bush Florida 42 day 3 FALSE
4 Richard Nixon California 258 day 45 TRUE
5 Bill Clinton Indiana 123 day 100 FALSE
上一篇 SO 帖子提供的解决方案将适用TRUE
到第 2 行和第 5 行,而我只想将其应用于第 1 行和第 4 行。