在R中查找重复值

59 r

我有一个21638个*行的表:

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

该表有五列,第一列包含受访者ID号.我想检查是否有任何受访者出现两次,或者所有受访者是否都是独特的.

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

length(unique(vocabulary$id))
Run Code Online (Sandbox Code Playgroud)

并检查我是否有任何重复

length(unique(vocabulary$id)) == nrow(vocabulary)
Run Code Online (Sandbox Code Playgroud)

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

我的问题:

有没有直接的方法来返回重复的值或行号?

进一步说明:

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


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

小智 99

你可以使用table,即

n_occur <- data.frame(table(vocabulary$id))
Run Code Online (Sandbox Code Playgroud)

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

n_occur[n_occur$Freq > 1,]
Run Code Online (Sandbox Code Playgroud)

告诉你哪些ids不止一次发生.

vocabulary[vocabulary$id %in% n_occur$Var1[n_occur$Freq > 1],]
Run Code Online (Sandbox Code Playgroud)

返回具有多个匹配项的记录.

  • 另一种方法是使用 dplyr 来识别重复的“var”。`df %&gt;% group_by(var) %&gt;% 总结(n=sum(n())) %&gt;% 过滤器(n&gt;1) ` (3认同)

Pie*_*nte 43

这将为您提供重复的行:

vocabulary[duplicated(vocabulary$id),]
Run Code Online (Sandbox Code Playgroud)

这将为您提供重复的数量:

dim(vocabulary[duplicated(vocabulary$id),])[1]
Run Code Online (Sandbox Code Playgroud)

例:

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
Run Code Online (Sandbox Code Playgroud)

编辑

好的,有了附加信息,这是你应该做的: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 
Run Code Online (Sandbox Code Playgroud)

  • 为了计算重复次数,我计划建议`sum(重复(词汇$ id))`,这对我来说似乎更简单. (2认同)

Dav*_* C. 12

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

# 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% id[duplicated(id)] ]
## [1] "b" "b" "c" "c" "c" "d" "d" "d" "d"
Run Code Online (Sandbox Code Playgroud)

希望这些帮助.祝好运.


edd*_*ddi 10

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

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

dt[duplicated(id), cbind(.SD[1], number = .N), by = id]
Run Code Online (Sandbox Code Playgroud)

  • @VanceLAlbaugh我会从这里开始 - https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-intro.html (2认同)

Lou*_*dox 5

一种更简洁的方式,可以是rev

x[!(!duplicated(x) & rev(!duplicated(rev(x))))]
Run Code Online (Sandbox Code Playgroud)

...而不是fromLast

x[!(!duplicated(x) & !duplicated(x, fromLast = TRUE))]
Run Code Online (Sandbox Code Playgroud)

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

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

将向量视为要传递的数据帧table很方便,但可能难以阅读,data.table解决方案很好,但我更喜欢使用基本 R 解决方案来处理简单的向量(如 ID)。