我有一个包含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
答案 0 :(得分:0)
我们可以将expand.grid
与paste
一起使用来创建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.
)。