根据多个字符在R中查找重复项

时间:2016-04-13 13:03:31

标签: r duplicates

我似乎无法记住如何在R中正确编码 -

如果我想根据多个条目删除csv文件中的重复项 - 存储在不同列中的名字和姓氏

然后我可以编码:file [(duplicated(file $ First.Name),] 但是只看第一个名字,我希望它能同时看到最后一个名字。

如果这是我的起始档案:

    Steve Jones
    Eric Brown
    Sally Edwards
    Steve Jones
    Eric Davis

我希望输出为

    Steve Jones
    Eric Brown
    Sally Edwards
    Eric Davis

仅删除匹配的名字和姓氏的名称。

4 个答案:

答案 0 :(得分:1)

如果只有一列,请使用sub删除子字符串(即名字)后跟空格,根据该字符串获取逻辑向量(!duplicated(..)以对数据集的行进行子集化

df1[!duplicated(sub("\\w+\\s+", "", df1$Col1)),,drop=FALSE]
#           Col1
#1   Steve Jones
#2    Eric Brown
#3 Sally Edwards
#5    Eric Davis

如果它基于两列且数据集有两列,则直接在数据集上执行duplicated以获取逻辑向量,否定它并对行进行子集化。

df1[!duplicated(df1), , drop=FALSE]
#  first.name second.name
#1      Steve       Jones
#2       Eric       Brown
#3      Sally     Edwards
#5       Eric       Davis

答案 1 :(得分:1)

以下是提高性能的解决方案(使用data.table,假设名字和姓氏存储在不同的列中):

> df <- read.table(text = 'Steve Jones
+     Eric Brown
+     Sally Edwards
+     Steve Jones
+     Eric Davis')

> colnames(df) <- c("First.Name","Last.Name")
> df
  First.Name Last.Name
1      Steve     Jones
2       Eric     Brown
3      Sally   Edwards
4      Steve     Jones
5       Eric     Davis

以下是data.table特定代码开始的位置

> dt <- setDT(df)
> unique(dt,by=c('First.Name','Last.Name'))
   First.Name Last.Name
1:      Steve     Jones
2:       Eric     Brown
3:      Sally   Edwards
4:       Eric     Davis

答案 2 :(得分:1)

您可以使用

file[!duplicated(file[c("First.Name", "Last.Name")]), ] 

答案 3 :(得分:0)

尝试:

!duplicated(paste(File$First.Name,File$Last.Name))