2

我有一个包含以下形式的两列的矩阵:

AAA 1/1/0            
AAA 1/0/1    
BBB 1/1/0      
BBB 1/1/0      
BBB 1/1/0    
BBB 1/1/0     
CCC 1/1/0   
CCC 1/0/1    
CCC 1/1/0     
CCC 1/0/1  

我想获得以下矩阵,该矩阵由第一列中的相同值过滤,第二列中不完全相同:

AAA 1/1/0  
AAA 1/0/1   
CCC 1/1/0  
CCC 1/0/1   

任何帮助,将不胜感激 !!!

塔拉

4

2 回答 2

1

使用来自@wleoncio 的数据和建议:

data <- data.frame(x1 = c(rep('AAA', 2), rep('BBB', 4), rep('CCC', 4)), x2 = c('1/1/0', '1/0/1', rep('1/1/0', 5), '1/0/1', '1/1/0', '1/0/1'))

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

# setkey, to make sure we only do the unique on the first two columns
setkey(dt, x1, x2)

# unique almost gets us there, we just need to also filter out the loners
unique(dt)[, .SD[.N > 1], by = x1]
#    x1    x2
#1: AAA 1/1/0
#2: AAA 1/0/1
#3: CCC 1/1/0
#4: CCC 1/0/1
于 2013-07-19T21:59:40.537 回答
1

对我来说,您似乎想保留:

  • 第一列中具有相同值的那些行,但也
  • 第二列中的不同行

这排除了带有的行,BBB因为第二列中的值都是相同的。如果是这种情况,那么您可以使用duplicated,但您还需要进一步进行子集化以删除这些行(感谢@wleoncio提供数据):

data <- data.frame(x1 = c(rep('AAA', 2), rep('BBB', 4), rep('CCC', 4)), x2 = c('1/1/0', '1/0/1', rep('1/1/0', 5), '1/0/1', '1/1/0', '1/0/1'))

newdat <- data[ ! duplicated(data) , ]
   x1    x2
1 AAA 1/1/0
2 AAA 1/0/1
3 BBB 1/1/0
7 CCC 1/1/0
8 CCC 1/0/1

keep <- unclass( table(newdat$x1) ) != 1
  AAA   BBB   CCC 
 TRUE FALSE  TRUE 

newdat[ newdat$x1 %in% unique(newdat$x1 )[keep]  , ]
   x1    x2
1 AAA 1/1/0
2 AAA 1/0/1
7 CCC 1/1/0
8 CCC 1/0/1
于 2013-07-19T21:59:58.980 回答