определить группы связанных эпизодов, которые соединяются вместе
1513 просмотра
3 ответа
Возьмите этот простой фрейм данных связанных идентификаторов:
test <- data.frame(id1=c(10,10,1,1,24,8),id2=c(1,36,24,45,300,11))
> test
id1 id2
1 10 1
2 10 36
3 1 24
4 1 45
5 24 300
6 8 11
Теперь я хочу сгруппировать все идентификаторы, которые связаны. Под «ссылкой» я подразумеваю переход по цепочке ссылок, чтобы все идентификаторы в одной группе были помечены вместе. Этакая ветвящаяся структура. то есть:
Group 1
10 --> 1, 1 --> (24,45)
24 --> 300
300 --> NULL
45 --> NULL
10 --> 36, 36 --> NULL,
Final group members: 10,1,24,36,45,300
Group 2
8 --> 11
11 --> NULL
Final group members: 8,11
Теперь я примерно знаю логику, которую хотел бы, но не знаю, как бы я ее элегантно реализовал. Я думаю о рекурсивном использовании match
или %in%
переходе к каждой ветви, но на этот раз я действительно озадачен.
Конечный результат, за которым я буду гоняться:
result <- data.frame(group=c(1,1,1,1,1,1,2,2),id=c(10,1,24,36,45,300,8,11))
> result
group id
1 1 10
2 1 1
3 1 24
4 1 36
5 1 45
6 1 300
7 2 8
8 2 11
Автор: thelatemail
Источник
Размещён: 12.11.2019 09:33
Ответы (3)
6 плюса
Пакет Bioconductor RBGL (интерфейс R к библиотеке графов BOOST) содержит функцию connectedComp()
, которая идентифицирует подключенные компоненты на графике - именно то, что вам нужно.
(Чтобы использовать эту функцию, вам сначала нужно установить пакеты graph и RBGL , доступные здесь и здесь .)
library(RBGL)
test <- data.frame(id1=c(10,10,1,1,24,8),id2=c(1,36,24,45,300,11))
## Convert your 'from-to' data to a 'node and edge-list' representation
## used by the 'graph' & 'RBGL' packages
g <- ftM2graphNEL(as.matrix(test))
## Extract the connected components
cc <- connectedComp(g)
## Massage results into the format you're after
ld <- lapply(seq_along(cc),
function(i) data.frame(group = names(cc)[i], id = cc[[i]]))
do.call(rbind, ld)
# group id
# 1 1 10
# 2 1 1
# 3 1 24
# 4 1 36
# 5 1 45
# 6 1 300
# 7 2 8
# 8 2 11
Автор: Josh O'Brien
Размещён: 27.08.2012 05:17
3 плюса
Вот альтернативный ответ, который я обнаружил сам после подталкивания Джоша в правильном направлении. Этот ответ использует igraph
пакет. Для тех, кто ищет и test
находит этот ответ, мой набор данных в теории графов называется «списком ребер» или «списком смежности» ( http://en.wikipedia.org/wiki/Graph_theory ).
library(igraph)
test <- data.frame(id1=c(10,10,1,1,24,8 ),id2=c(1,36,24,45,300,11))
gr.test <- graph.data.frame(test)
links <- data.frame(id=unique(unlist(test)),group=clusters(gr.test)$membership)
links[order(links$group),]
# id group
#1 10 1
#2 1 1
#3 24 1
#5 36 1
#6 45 1
#7 300 1
#4 8 2
#8 11 2
Автор: thelatemail
Размещён: 29.08.2012 04:04
1 плюс
Без использования пакетов:
# 2 sets of test data
mytest <- data.frame(id1=c(10,10,3,1,1,24,8,11,32,11,45),id2=c(1,36,50,24,45,300,11,8,32,12,49))
test <- data.frame(id1=c(10,10,1,1,24,8),id2=c(1,36,24,45,300,11))
grouppairs <- function(df){
# from wide to long format; assumes df is 2 columns of related id's
test <- data.frame(group = 1:nrow(df),val = unlist(df))
# keep moving to next pair until all same values have same group
i <- 0
while(any(duplicated(unique(test)$val))){
i <- i+1
# get group of matching values
matches <- test[test$val == test$val[i],'group']
# change all groups with matching values to same group
test[test$group %in% matches,'group'] <- test$group[i]
}
# renumber starting from 1 and show only unique values in group order
test$group <- match(test$group, sort(unique(test$group)))
unique(test)[order(unique(test)$group), ]
}
# test
grouppairs(test)
grouppairs(mytest)
Автор: ARobertson
Размещён: 10.11.2014 01:53
Вопросы из категории :
- r Как получить доступ к последнему значению в векторе?
- r Пакеты оптимизации для R
- r Есть ли у R такие операторские операции, как Perl qw ()?
- r Библиотека / инструмент для рисования тройных / треугольных графиков
- r Участки без заголовков / надписей в R
- grouping Rails has_many считает количество дочерних строк
- grouping Элементы WPF не отображаются при применении группировки
- grouping Группировка списка кортежей Python
- grouping Есть ли накопитель (), который принимает матрицу как «val»?
- grouping Как сгруппировать элементы в python по n элементам?
- identifier Как получить функциональность Python isidentifer () в Python 2.6?
- identifier Становятся ли элементы дерева DOM с идентификаторами глобальными переменными?
- identifier Прокрутите до идентификатора фрагмента на новой странице при загрузке с помощью JQuery?
- identifier Регулярное выражение, чтобы подтвердить, является ли строка допустимым идентификатором в Python
- identifier Невозможно разрешить идентификатор на NetBeans
- linkage Зачем нам нужен extern "C" {#include <foo.h>} в C ++?
- linkage Каково влияние extern "C" в C ++?
- linkage Почему шаблоны не могут быть внутри внешних блоков "C"?
- linkage нестатическое объявление после статического объявления
- linkage Неправильная связь `char * array [size]` и `extern char ** array`?