Простая обработка данных в R - PullRequest
0 голосов
/ 10 мая 2011

@ Анико отмечает, что одним из способов решения моей проблемы является то, что мне нужно найти связанные компоненты графа, где вершины называются группами, а переменные group и nominated_group указывают ребра между этими двумя группами. , Моя цель - создать переменную parent_Group, которая индексирует подключенные компоненты. Или, как я сказал раньше:

У меня есть фрейм данных с четырьмя переменными: ID, group, nominated_ID и nominated_Group.

Рассмотрим сестринские группы: группы A и B являются сестринскими группами, если в данных есть хотя бы один случай, когда group == A и nominated_group == B, или наоборот.

Я хотел бы создать переменную parent_group, которая принимает уникальное значение для каждого набора сестринских групп. Другими словами, не должно быть назначений между случаями в разных parent_group с. Создание parent_group последовательных чисел кажется хорошей идеей.

Большое спасибо за помощь, которую я уже получил здесь ! Я не могу здесь внести свой вклад, но учтите, что я пытаюсь оплатить его вперед в stats.exchange и в википедии.

По моим поддельным данным, A и B - сестринские группы. Для подтверждения этого достаточно либо ID дела = 4, либо ID = 5. Каждая группа также является собственной сестринской группой. Цель, создание parent_group, должна привести к одному parent_group для всех случаев в A или B и другому parent_group для группы C

df <- data.frame(ID = c(9, 5, 2, 4, 3, 7), 
  group = c("A", "A", "B", "B", "A", "C"),
  nominated_ID = c(9, 8, 4, 9, 2, 7)     )

df$nominated_group <- with(df, group[match(nominated_ID, ID)])

df

  ID group nominated_ID nominated_group
1  9     A            9               A
2  5     A            8            <NA>
3  2     B            4               B
4  4     B            9               A
5  3     A            2               B
6  7     C            7               C

1 Ответ

3 голосов
/ 11 мая 2011

Рассмотрим граф с группами в качестве его вершин и ребер, указывающих, что две группы встречаются для одного и того же идентификатора. Тогда я думаю, что вы ищете связанные компоненты этого графика. Ниже приведена быстрая и грязная (и, вероятно, не оптимальная) реализация этой идеи с использованием пакета graph:

library(graph)
#make some fake data
nom <- data.frame(group = c("A","A","A","B","B","C","C"),
                  group2 = c("A","A","B","B","A","C","C"),
            stringsAsFactors=FALSE)
#remove duplicated pairs
#it will keep A-B distinct from B-A, could probably be fixed
nom1 <- nom[!duplicated(nom),]

#define empty graph
grps <- union(unique(nom$group), unique(nom$group2))
gg <- new("graphNEL", nodes=grps, edgeL=list())
#add an edge for every pair
for (i in 1:nrow(nom1)) gg <- addEdge(nom1$group[i], nom1$group2[i], gg, 1)

#find connected components
cc <- connComp(gg)

#assing parent by matching within cc
nom$parent <- apply(nom, 1, 
    function(x) which(sapply(cc, function(y) x["group"] %in% y)))
nom

  group group2 parent
1     A      A      1
2     A      A      1
3     A      B      1
4     B      B      1
5     B      A      1
6     C      C      2
7     C      C      2
...