识别 table() R 中出现的条目/记录

Identify entries / records that appear in table() R

我正在尝试从披露控制项目的数据集中识别 'unique' 和 'near unique' 个案例或记录​​。特别是某些只出现一次、两次等的变量的组合

记录出现在:

table(Age,Sex,Ethnicity)

我对以下元素(为真)最感兴趣:

table(Age,Sex,Ethnicity)==1 
table(Age,Sex,Ethnicity)==2 

我知道我正在寻找大约 150 个案例:

sum(table(Age,Sex,Ethnicity)==1)

数据集中还有一个标识符,它是一个很好的输出,或者来自 1:length(Age)*length(Sex)*length(Ethnicity) 的数字也一样好。我希望它 return 像这样的列表:

[1] 103 207 218....   
[41] * * *
[81] * * *

其中 'identifier' = 103、207 和 218 对于 150 个案例中的前 3 个,其中:

table(Age,Sex,Ethnicity)==1

我天真地希望是这样的:

data$identifier[table(age,sex,mar,emp,edu) == 1]    
names(table(Age,Sex,Ethnicity) 

可以,但没有这样的运气。我也研究过 unique() 但 returns 每个组合(出现一次或多次)。任何帮助或意见将不胜感激。

添加了可重现的示例(希望如此) 范例

set.seed(1234)
a <- 1+rpois(100,1)
b <- 1+rpois(100,1)
c <- 1+rpois(100,1)
a[a >= 5] <- 4
b[b >= 5] <- 4
c[c >= 5] <- 4
eg <- cbind(1:100,a,b,c)
(sum(table(a,b,c)==1))

应该有 12 个 'unique' 组合,我想使用 eg 的第一列(或数据集中的标识符)

来识别它们

我认为最简单的方法是使用 data.table 包:

library(data.table)
eg.dt <- as.data.table(eg)
eg.dt[, list(N=.N), by=.(a,b,c)][N==1]

工作原理:eg.dt[, list(N=.N), by=.(a,b,c)] 计算每个 (a,b,c) 组合出现的次数。 [N==1] 过滤掉恰好出现一次的那些。

或者如果你想坚持使用数据帧(不是 data.table)尝试 plyr:

library(plyr)
eg <- data.frame(eg)
subset(ddply(eg, .(a, b, c), nrow), V1 == 1)

这以相同的方式工作:ddply(eg, .(a, b, c), nrow) 生成一个数据框,其中列 "V1" 是组合发生的次数;然后你只需将它的子集用于仅出现一次的组合。

我想可能有一种方法可以用你的 table(a,b,c) 做到这一点,但我想不出一个不复杂的方法。