我想识别数据框中行的“部分”匹配。具体来说,如果数据框中的特定行基于列的子集之间的匹配,则在数据框中的特定行在数据框中其他地方有重复的行时,我想创建一个值为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行沿name
和state
列匹配,并且其绝对值在num
列中匹配,从而在添加的{这两个行的{1}}列,而其余行没有这样的匹配,因此其值为1
。
我尝试了以下操作,但无济于事:
newcol
当然由于0
答案 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
设为1
或0
,则可以使用as.integer
将其转换为整数。但是在大多数情况下,最好将布尔标志保留为逻辑类型。