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

如何识别R中部分重复的行,r,R,我想确定数据帧中行的部分匹配。具体地说,如果基于列子集之间的匹配,数据帧中的某个特定行在数据帧的其他位置具有重复行,我希望创建一个值为1的新列。更复杂的是,数据帧中的一列是数字,如果绝对值匹配,我希望匹配。下面是示例数据,后面是我所需输出的示例 name<-c("Richard Nixon", "Bill Clinton", "George Bush", "Richard Nixon") state<-c("California", "Indiana", "Florida", "Ca

我想确定数据帧中行的部分匹配。具体地说,如果基于列子集之间的匹配,数据帧中的某个特定行在数据帧的其他位置具有重复行,我希望创建一个值为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
请注意,行1和行2沿名称和状态列匹配,它们的绝对值在num列中匹配,导致这两行的added newcol列中的值均为1,而其余行没有此类匹配,因此其值为0

我尝试了以下方法,但没有成功:

df$num<-as.numeric(df$num)
which(duplicated(df[c('name', 'state',abs('num'))]),)

Error in abs("num") : non-numeric argument to mathematical function
当然,这不起作用,因为您可以使用abs

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为1或0,则可以使用as.integer将其转换为整数。但在大多数情况下,最好将布尔标志保留为逻辑类型。

出现错误的原因是您试图获取字符串numYes的abs。我知道这很明显,我认为这不起作用,只是显示了我的尝试…谢谢@dww,如果你有兴趣的话,我在这里发布了一个更复杂的问题:基本上它和这里的问题是一样的,除了我希望匹配只在匹配num的绝对值而不是原始值时返回TRUE。。。
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