Функция, которая группирует значения списка (в R)
Я пытаюсь создать функцию, которая не должна быть сложной с точки зрения программирования, но у меня есть некоторые трудности для ее концептуализации. Надеюсь, вы сможете понять мою проблему лучше, чем я!
Я хотел бы функцию, которая принимает один список векторов в качестве аргумента. Что-то вроде
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] ]). Обратите внимание, что одна позиция или номер могут быть в нескольких группах.
Пожалуйста, дайте мне знать, если что-то неясно в моем вопросе! Спасибо!
1 ответ
Как я писал в комментариях, кажется, что вам нужен фрейм данных, в котором перечислены максимальные клики графа с учетом списка векторов, которые определяют ребра.
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