У меня есть таблица, показывающая двусторонние родственные связи.Другими словами, у меня может быть первый ряд, показывающий историю отца, у которого есть сын, а в следующей строке этот сын показывает свои отношения с отцом.Но у отца может быть еще один сын (сын2), поэтому у нас есть еще две записи в таблице, показывающие отца, связанного с его сыном2, и сына2, связанного с общим отцом.Проблема возникает, когда отношения между двумя сыновьями не указаны в таблице.Нет записи, показывающей, что son1 - брат son2, и мне нужно извлечь это из таблицы.Это моя цель, и у каждого человека в таблице есть уникальный идентификатор.
До сих пор я пытался сделать следующее:
a) Создать список всехвозможные роли родства (в моем упрощенном примере выше, было бы только 2 роли: отец и сын).
b) Разбить исходную таблицу на столько групп, сколько имеется ролей.Поскольку любой человек в моем примере может быть сыном и / или отцом, я создаю две группы данных.Эти группы являются элементами списка, поэтому, другими словами, я создал список путем подстановки ролей записей.В этом примере список имеет два элемента: один для записей, где второй человек является сыном первого, и другой элемент, показывающий записи, второй человек которых является отцом первого.
c) MyИдея заключалась также в том, чтобы заменить предыдущие (два) элемента списка идентификатором первого лица.Таким образом, моя цель состояла в том, чтобы создать группы каждого идентификатора со всеми связями, которые у них есть.Например, в нашем примере мы получили бы группу для одного идентификатора (отца), образованную двумя строками: записи son1 и son2.
d) Однажды здесь предыдущая подгруппа показывает, что son1 и son2Братья.Поскольку, опять же, об этом не сообщается в исходной таблице, моя цель состоит в том, чтобы получить его путем кодирования, создав две новые записи в исходной таблице, которые показали бы, что у son1 есть брат son2, а у son2 есть брат son1.
Учитывая, что мой фрейм данных - это df, а переменная роль второго человека в отношении - Role_2nd, шаг а) прост:
role <- unique(df$Role_2nd)
Шаг б) также прост:
newRoles <- lapply(role, function(x){subset(df, Role_2nd == x)})
После шага c) результат для первого элемента списка - роль, которую я поднастроил = "сын" - может выглядеть следующим образом:
ID_First ID_Second Role_1st Role_2nd
569 571 father son
590 592 father son
587 597 father son
597 596 father son
597 598 father son
603 604 father son
603 607 father son
Как мы видим, идентификатор 597имеет двух сыновей (596 и 598).Это означает, что 596 и 598 являются братьями и сестрами, и мне нужно вывести это отношение, отсутствующее в исходной таблице.
После шага d) и поднабор по идентификатору:
ID_First ID_Second Role_1st Role_2nd
569 571 father son
ID_First ID_Second Role_1st Role_2nd
590 592 father son
ID_First ID_Second Role_1st Role_2nd
587 597 father son
ID_First ID_Second Role_1st Role_2nd
597 596 father son
597 598 father son
ID_First ID_Second Role_1st Role_2nd
603 604 father son
603 607 father son
(возможно, шаг d) обязателен для моей конечной цели).
Следуя примеру, другой элемент списка - элемент для отца в роли Role_2nd - должен выглядеть примерно так:
Step c)
ID_First ID_Second Role_1st Role_2nd
571 569 son father
592 590 son father
597 587 son father
596 597 son father
598 597 son father
604 603 son father
607 603 son father
I skip showing step d) also for the second element.
Вот то, с чем я застрял.Если все вышеприведенное верно - вероятно, есть более простые способы решения проблемы - учитывая, что я хочу создать роль «брат», отсутствующую в моей исходной таблице, моя идея состоит в том, чтобы пропустить два элемента списка черезпетля.Начиная с первого, всякий раз, когда я замечаю повторный ID_First (что происходит для 597 и 603), это будет означать, что два человека, с которыми они связаны (с одной стороны -596 и 598, а с другой 604 &607-) должно быть "братья".
Но я не знаю, как это сделать.Я не знаю, как определить несколько одинаковых значений переменной в элементе списка (например, найти два или более одинаковых ID_First в первом элементе списка);Я не знаю, как их подгруппировать;Я не знаю, как запустить цикл для каждого компонента каждого элемента списка;Я не знаю, как я мог бы кодировать это более простым способом, чем выполнять бесконечный цикл (здесь я показываю только две разные роли, но величина ролей в моем случае очень велика - поскольку я работаюс «незападными» родственными отношениями -).
Подводя итог, окончательный результат для моей проблемы будет примерно таким:
ID_First ID_Second Role_1st Role_2nd
596 597 son father
598 597 son father
596 598 brother brother
598 596 brother brother
604 603 son father
607 603 son father
604 607 brother brother
607 604 brother brother
ЕслиЛюбой может дать любые советы, они будут очень рады.
Спасибо за миллион!