R - 删除提供特定值组合的行

时间:2016-11-15 10:56:39

标签: r subset

我有一个包含100个对象的列表,我使用

创建所有可能的对象
mgr.OnStart = sndr => { var sga = sndr.GetAllInfo(); };

但是A组的任何对象都不能组合到B组的任何对象。 意味着

pairs <- t(combn(my_objects, 2))

应该删除一对6和55,无论它们在哪一行。 5和6的组合是可以的。 如何查看其中一行&#34;禁止&#34;配对并删除它?我尝试了group_A <- c(5:10) group_B <- c(50:55) ,但我不知道如何将它用于多个对象。

修改

我真正的问题是这样的: 我有一个75个字符的列表,A1 ... A75。它们应该组合成对。但是group_A(5 ... 10)中的一个永远不应该组合成group_B(50 ... 55)之一。

第二步:可以是%in%中一行的条目可以是:pairs。该对也应该被删除。

我的数据框是:

A1.A8 - A2.A.12.A51

我的目标 - 从 pairs <- cbind (c("A1", "A9.A3", "A5", "A52.A12", "A8"), c("A76.A14", "A50", "A2.A7", "A70", "A50.A51")) group_A <- c("A5", "A6" "A7", "A8", "A9", "A10") group_B <- c("A50", "A51", "A52", "A53", "A54", "A55") 数据框中删除group_A和group_B的所有项目组合。所以pairs =

pairs

2 个答案:

答案 0 :(得分:0)

我们可以将expand.gridpaste一起使用来创建vector个组合,检查这些元素是否%in% vector创建了combn },否定(!)并使用此逻辑向量对“对”进行子集化。

v1 <- combn(length(my_objects), 2, FUN = paste, collapse=" ")
pairs[!v1 %in% do.call(paste, expand.grid(group_A, group_B)),]

答案 1 :(得分:0)

这不是很优雅,但是(我认为)它可以做你想要的:对于每一行,按字符'。'分割每列中的条目,然后检查是否与group_A或group_B有任何重叠,如果是,将行索引添加到要删除的行的向量:

rm_idx <- c()
for (r in 1:nrow(pairs)) {  # for each row of pairs...
  pair_A <- unlist(strsplit(pairs[r,1],'[.]')) # split first element by '.'
  pair_B <- unlist(strsplit(pairs[r,2],'[.]')) # split second elemnt by '.'
  l_A <- length(intersect( group_A,  pair_A)) # elements of group_A in pair_A
  l_B <- length(intersect( group_B,  pair_B)) # elements of group_A in pair_A
  if (l_A > 0 & l_B > 0) { # if there is overlap in both entries of that row --> remove
    rm_idx <- c(rm_idx, r)
  }
}
new_pairs <- pairs[-rm_idx,]    

或者,您可以创建一个可与grepl一起使用的正则表达式,以查找字符串中group_A的任何元素:

# concatenate vector of strings (with '|'), creating a regular expression for
# searching for any of them (using grep/grepl)
grp2reg <- function (g) {
  paste(g, collapse ='|')
}

# append dot to string (or each of a vector of strings)
add_dot <- function(g) {
  paste(g, '.', sep='')
}

# find strings from group_A/group_B in first/second column of pairs
idx_A <- grepl(grp2reg(add_dot(group_A)), add_dot(pairs[,1]) )
idx_B <- grepl(grp2reg(add_dot(group_B)), add_dot(pairs[,2]) )

# remove rows with a match in both columns
pairs_new <- pairs[!(idx_A & idx_B),]

请注意附加'。'这里需要所有字符串,以避免在“{1}}中找到A5”。因此,A50的正则表达式实际上是group_A,并且点也会附加到"A5.|A6.|A7.|A8.|A9.|A10."的元素(以便在pairs中查找A5. )。