如何识别R中行的部分重复

时间:2019-02-13 01:24:30

标签: r

我想识别数据框中行的“部分”匹配。具体来说,如果数据框中的特定行基于列的子集之间的匹配,则在数据框中的特定行在数据框中其他地方有重复的行时,我想创建一个值为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

我希望获得以下数据帧:

           name      state  num   date newcol
1 Richard Nixon California -258  day 2 1
2  Bill Clinton    Indiana  123 day 15 0
3   George Bush    Florida   42  day 3 0
4 Richard Nixon California  258 day 45 1

请注意,第1行和第2行沿namestate列匹配,并且其绝对值在num列中匹配,从而在添加的{这两个行的{1}}列,而其余行没有这样的匹配,因此其值为1

我尝试了以下操作,但无济于事:

newcol

当然由于0

无法正常工作

1 个答案:

答案 0 :(得分:1)

您可以使用

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

如果您确实需要将newcol设为10,则可以使用as.integer将其转换为整数。但是在大多数情况下,最好将布尔标志保留为逻辑类型。