在R中查找重复值

时间:2013-06-03 20:37:16

标签: r

我有一个包含21638个唯一*行的表:

vocabulary <- read.table("http://socserv.socsci.mcmaster.ca/jfox/Books/Applied-Regression-2E/datasets/Vocabulary.txt", header=T)

此表有五列,第一列包含响应者ID号。我想检查是否有任何受访者出现两次,或者所有受访者是否都是唯一的。

要计算我可以使用的唯一ID

length(unique(vocabulary$id))

并检查我是否有任何重复

length(unique(vocabulary$id)) == nrow(vocabulary)

如果没有重复项(没有重复项),则返回TRUE

我的问题:

是否有直接返回重复值的值或行号的方法?

进一步说明:

使用函数duplicated()存在解释问题,因为只返回严格意义上的重复项,不包括“原件”。例如,sum(duplicated(vocabulary$id))dim(vocabulary[duplicated(vocabulary$id),])[1]可能会返回“5”作为重复行的数量。问题是,如果您只知道重复项的数量,则不会知道它们复制了多少行。 “5”是否意味着有五行,每行有一个重复,或者有一行有五个重复?由于您不会拥有重复项的ID或行号,因此您无法找到“原件”。


* 我知道此调查中没有重复的ID,但这是一个很好的例子,因为使用此问题的其他地方给出的任何答案,例如duplicated(vocabulary$id)table(vocabulary$id)输出一个大海捞针到你的屏幕,在那里你将无法找到任何可能罕见的重复针。

5 个答案:

答案 0 :(得分:91)

您可以使用table,即

n_occur <- data.frame(table(vocabulary$id))

为您提供一个数据框,其中包含id个列表及其出现的次数。

n_occur[n_occur$Freq > 1,]

告诉您哪些id多次出现。

vocabulary[vocabulary$id %in% n_occur$Var1[n_occur$Freq > 1],]

返回多次出现的记录。

答案 1 :(得分:35)

这将为您提供重复的行:

vocabulary[duplicated(vocabulary$id),]

这将为您提供重复数量:

dim(vocabulary[duplicated(vocabulary$id),])[1]

示例:

vocabulary2 <-rbind(vocabulary,vocabulary[1,]) #creates a duplicate at the end
vocabulary2[duplicated(vocabulary2$id),]
#            id year    sex education vocabulary
#21639 20040001 2004 Female         9          3
dim(vocabulary2[duplicated(vocabulary2$id),])[1]
#[1] 1 #=1 duplicate

修改

好的,通过附加信息,您应该执行以下操作:duplicated有一个fromLast选项,允许您从最后获取重复项。如果将其与普通duplicated结合使用,则会得到所有重复项。以下示例将重复项添加到原始词汇表对象(第1行重复两次,第5行重复一次)。然后我使用table来获取每个ID的重复总数。

#Create vocabulary object with duplicates
voc.dups <-rbind(vocabulary,vocabulary[1,],vocabulary[1,],vocabulary[5,])

#List duplicates
dups <-voc.dups[duplicated(voc.dups$id)|duplicated(voc.dups$id, fromLast=TRUE),]
dups
#            id year    sex education vocabulary
#1     20040001 2004 Female         9          3
#5     20040008 2004   Male        14          1
#21639 20040001 2004 Female         9          3
#21640 20040001 2004 Female         9          3
#51000 20040008 2004   Male        14          1

#Count duplicates by id
table(dups$id)
#20040001 20040008 
#       3        2 

答案 2 :(得分:12)

在这里,我总结了一些可能会给您的问题带来不同结果的方法,所以要小心:

<select ng-model="point" ng-options="i.value as (i.value) for i in uptpm">
  <option value="" selected>Please Select</option>
</select>

希望这些帮助。祝你好运。

答案 3 :(得分:10)

这是一个data.table解决方案,它将列出重复项以及重复次数(如果有2份副本,则为1,依此类推 - 您可以根据需要进行调整):

library(data.table)
dt = data.table(vocabulary)

dt[duplicated(id), cbind(.SD[1], number = .N), by = id]

答案 4 :(得分:4)

采用rev

的方式
x[!(!duplicated(x) & rev(!duplicated(rev(x))))]

...而不是fromLast

x[!(!duplicated(x) & !duplicated(x, fromLast = TRUE))]

...并作为辅助函数提供逻辑向量或原始向量中的元素:

duplicates <- function(x, as.bool = FALSE) {
    is.dup <- !(!duplicated(x) & rev(!duplicated(rev(x))))
    if (as.bool) { is.dup } else { x[is.dup] }
}

将向量作为数据帧处理以传递给table很方便,但可能难以阅读,data.table解决方案很好,但我更喜欢基本R解决方案来处理像ID这样的简单向量