基于R中的两个条件语句逐行比较

时间:2013-07-19 21:28:21

标签: r

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

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   

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

塔拉

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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