2

次の形式の 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  

最初の列で同一の値でフィルタリングされ、2番目の列で同一でない次のマトリックスを取得したいと思います。

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

私には、あなたが維持したいように見えます:

  • 最初の列に同じ値を持つ行だけでなく、
  • 2 番目の列の同一でない行

BBB2 番目の列の値がすべて同一であるため、これは の行を除外します。その場合は を使用できますが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 に答える