在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”作为重复行数。 问题是,如果你只知道重复的数量,你将不知道他们有多less行重复。 “5”是指有五行,每一行有一个重复,还是有一行有五个重复? 而且由于您不会有重复的ID或行号,您将无法find“原件”。


* 我知道在这个调查中没有重复的ID,但是这是一个很好的例子,因为使用任何其他地方给出的答案,比如duplicated(vocabulary$id)或者table(vocabulary$id)都会输出干草堆你的屏幕,你将无法find任何可能的罕见重复的针头。

你可以使用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],] 

返回具有多个事件的logging。

这会给你重复的行:

 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 

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

 # First assign your "id"s to an R object. # Here's a hypothetical example: id <- c("a","b","b","c","c","c","d","d","d","d") #To return ALL MINUS ONE duplicated values: id[duplicated(id)] ## [1] "b" "c" "c" "d" "d" "d" #To return ALL duplicated values by specifying fromLast argument: id[duplicated(id) | duplicated(id, fromLast=TRUE)] ## [1] "b" "b" "c" "c" "c" "d" "d" "d" "d" #Yet another way to return ALL duplicated values, using %in% operator: id[id %in% unique(id[duplicated(id)])] ## [1] "b" "b" "c" "c" "c" "d" "d" "d" "d" 

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

这里有一个data.table解决scheme,它将列出重复项以及重复项的数量(如果有两个副本,则为1) – 您可以根据需要进行调整):

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

一个简洁的方式,无论是与rev

 x[!(!duplicated(x) & rev(!duplicated(rev(x))))] 

…而不是fromLast

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

…作为辅助函数提供逻辑vector或从原始vector元素:

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

处理向量作为dataframe传递到table是方便的,但可以很难阅读, data.table解决scheme是好的,但我更喜欢基础R解决scheme来处理简单的向量,如ID。