排除先前已满足元素N次的行

时间:2014-07-14 11:45:49

标签: r

我有以下输入数据:

#     [,1] [,2]
#[1,] "A"  "B" 
#[2,] "A"  "C" 
#[3,] "A"  "D" 
#[4,] "B"  "C" 
#[5,] "B"  "D" 
#[6,] "C"  "D" 

接下来我想要排除第一个或第二个元素先前已经N次的行。例如,如果N = 2,则需要排除以下行:

#[3,] "A"  "D" - element "A" has been 2 times
#[5,] "B"  "D" - element "B" has been 2 times
#[6,] "C"  "D" - element "C" has been 2 times

注意:需要考虑立即排除结果。例如,如果元素已满足5次,并且在删除它之后只遇到1次,则需要使用此元素留下下一行。因为它现在遇到了2次。

示例(N = 2):

输入数据:

      [,1] [,2]
 [1,] "A"  "B" 
 [2,] "A"  "C" 
 [3,] "A"  "D" 
 [4,] "A"  "E" 
 [5,] "B"  "C" 
 [6,] "B"  "D" 
 [7,] "B"  "E" 
 [8,] "C"  "D" 
 [9,] "C"  "E" 
[10,] "D"  "E"  

输出数据:

     [,1] [,2]
 [1,] "A"  "B" 
 [2,] "A"  "C" 
 [5,] "B"  "C" 
[10,] "D"  "E" 

1 个答案:

答案 0 :(得分:1)

可能有更优雅的解决方案......但这似乎有效:

v <- c("A", "B", "C", "D", "E")
cmb <- t(combn(v, 2))

n <- 2

# Go through each letter
for (l in v)
  {
  # Find the combinations using that letter 
  rows <- apply(cmb, 1, function(x){l %in% x})

  rows.2 <- which(rows==T)
  if (length(rows.2)>n)
    rows.2 <- rows.2[1:n]

  # Take the first n rows containing the letter,
  # then append all the ones not containing it
  cmb <- rbind(cmb[rows.2,], cmb[rows==F,])
  }

cmb

输出:

    [,1] [,2]
[1,] "D"  "E" 
[2,] "B"  "C" 
[3,] "A"  "C" 
[4,] "A"  "B"