我正在尝试构建一个在编程方面不应该很难的函数,但是我在构思它时遇到了一些困难。希望你能比我更好地理解我的问题!
我想要一个函数,它将一个向量列表作为参数。像
这样的东西arg1 = list(c(1,2), c(2,3), c(5,6), c(1,3), c(4,6), c(6,7), c(7,5), c(5,8))
该函数应输出一个包含两列的矩阵(或两个向量的列表或类似的列表),其中一列包含字母和其他数字。人们可以将该论证视为应该放在同一组中的位置/值的列表。如果列表中有向量c(5,6)
,则输出应包含数字列中值5
和6
旁边的相同字母。如果有以下三个向量c(1,2)
,c(2,3)
和c(1,3)
,则输出应包含值1
,2
旁边的相同字母和数字列中的3
。
因此,如果我们在函数中输入对象arg1
,它应该返回:
myFun(arg1)
number_column letters_column
1 A
2 A
3 A
5 B
6 B
7 B
4 C
6 C
5 D
8 D
(顺序并不重要。在使用字母E
之前,字母D
不应出现)
因此该函数构造了2组3(A:[1,2,3]和B:[5,6,7])和2组2(C:[4,6]和D:[ 5,8])。注意一个位置或数字可以在几个组中。
如果我的问题不清楚,请告诉我!谢谢!
答案 0 :(得分:2)
正如我在评论中所写,似乎你想要一个列出maximal cliques of a graph的数据框,给出一个定义边缘的向量列表。
require(igraph)
## create a matrix where each row is an edge
argmatrix <- do.call(rbind, arg1)
## create an igraph object from the matrix of edges
gph <- graph.edgelist(argmatrix, directed = FALSE)
## returns a list of the maximal cliques of the graph
mxc <- maximal.cliques(gph)
## creates a data frame of the output
dat <- data.frame(number_column = unlist(mxc),
group_column = rep.int(seq_along(mxc),times = sapply(mxc,length)))
## converts group numbers to letters
## ONLY USE if max(dat$group_column) <= 26
dat$group_column <- LETTERS[dat$group_column]
# number_column group_column
# 1 5 A
# 2 8 A
# 3 5 B
# 4 6 B
# 5 7 B
# 6 4 C
# 7 6 C
# 8 3 D
# 9 1 D
# 10 2 D