Функция, которая группирует значения списка (в 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
Другие вопросы по тегам