在R中识别重复和原始观察(可能通过聚类)

时间:2016-10-10 14:36:55

标签: r duplicates

我怀疑受访者是在作弊。我找到了重复的答案,但如果我只使用duplicated()和/或unique()函数,我只得到重复项(没有原点)或唯一值(没有重复项)。我想知道哪一个是重复的观察结果。 R中是否有一个函数可以很容易地找到哪些观察结果具有相同的答案模式?

#df
id <- c("l","l","l","p","p","a","a","a")
show <- c("broadway","cats","alladin","broadway","cats","broadway","cats","alladin")
v1 <- c(1,2,2,1,3,1,2,1)
v2 <- c(1,2,2,2,4,1,2,3)
v3 <- c(1,2,2,5,1,1,2,4)
df <- data.frame(id,show,v1,v2,v3); df

这是我用来识别重复项的脚本。我只对数据框的数字部分中出现的重复感兴趣,因此我只选择第3到第5列。

#script I'm using to find duplicates
duplicates <- data.frame(which(duplicated(df[,3:5]))) 

这个问题不是Identify duplicates and mark first occurrence and all others的重复,因为我对二进制输出不感兴趣。一个对我有很大帮助的解决方案是,如果我能够确定存在哪些重复集群。在这种情况下,df [6,]是df [1,](簇1)的副本,df [3,]和df [7,]是df [2,](簇2)的重复

将Wietze的解决方案与dplyr软件包结合使用可以获得一个很好的解决方案:

 library(dplyr) 
 df %>% group_by(v1, v2, v3) %>% filter(n() > 1)

由于我不熟悉dplyr中使用的语法,我还有一个问题。看起来在数据帧的末尾添加了一个列(n),但如果我将该函数保存为对象并请求最后一列,则它不会返回给我n。我如何使用此解决方案找到添加了n列的原始数据框?这就是我想要的输出看起来像使用dplyr包的方式:

id_e <- c("l","l","l","a","a")
show_e <- c("broadway","cats","alladin","broadway","cats")
v1_e <- c(1,2,2,1,2)
v2_e <- c(1,2,2,1,2)
v3_e <- c(1,2,2,1,2)
dup_cluster <- c(2,3,3,2,3)
df_expected <- data.frame(id_e,show_e,v1_e,v2_e,v3_e,dup_cluster); df_expected

我在这里发布了两个对我有用的解决方案。解决方案1:

 df %>% group_by(v1, v2, v3) %>% mutate(n = n()) %>% filter(n > 1) #add an extra column with a new category
 df <- dataframe(df) #transform back into dataframe

解决方案2:

setDT(df)[, .(.N, id, show) , by=.(v1,v2,v3)][N>1,]

2 个答案:

答案 0 :(得分:2)

使用library(data.table),我们可以

setDT(df)[, .(.N, id, show) , by=.(v1,v2,v3)][N>1,]

答案 1 :(得分:1)

使用dplyr包:

library(dplyr) 


#filter on n, do not create new column
df %>% group_by(v1, v2, v3) %>% filter(n() > 1)

#filter on n, create new column
df %>% group_by(v1, v2, v3) %>% mutate(n = n()) %>% filter(n > 1)