Новый фрейм данных на основе связей между наблюдениями в существующем фрейме данных в R - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю над фреймом данных, который выглядит примерно так:

DF.1:

“Ind. Name”          “Ind. ID”         “Inst”     “Inst. ID”
J. Smith             12345               A           532
K. Kapplan           12346               A           532
A. Lindt             12347               A           532
B. Johnson           12348               B           761
E. Pitt              12349               B           761
S. Mathews           12351               C           890
P. Rawles            12351               C           890    
P. Right             12352               C           890
O. Stray             12353               C           890

Мне нужно создать функцию, которая позволит мне получить что-то вроде этого:

Df.Result:

“Ind. Name” “Ind.ID”  “Linked Ind.” “Linked Ind.ID” “Inst” “Inst.ID”
  J. Smith    12345    K. Kapplan        12346         A      352
  J. Smith    12345    A. Lindt          12347         A      352
  K. Kapplan  12346    J. Smith          12345         A      352   
  K. Kapplan  12346    A. Lindt          12347         A      352
  A. Lindt    12347    J. Smith          12345         A      352
  A. Lindt    12347    K. Kapplan        12346         A      352
  B. Johnson  12348    E. Pitt           12349         B      761
  E. Pitt     12349    B. Johnson        12348         B      761
  S. Mathews  12351    P. Rawles         12351         C      890
  S. Mathews  12351    P. Right          12352         C      890
  S. Mathews  12351    O. Stray          12353         C      890
  P. Rawles   12351    P. Right          12352         C      890
  P. Rawles   12351    S. Mathews        12351         C      890   
  P. Rawles   12351    O. Stray          12353         C      890
  P. Right    12352    O. Stray          12353         C      890
  P. Right    12352    P. Rawles         12351         C      890
  P. Right    12352    S. Mathews        12351         C      890   
  O. Stray    12353    P. Right          12352         C      890
  O. Stray    12353    P. Rawles         12351         C      890
  O. Stray    12353    S. Mathews        12351         C      890

По сути, мне нужен фрейм данных, который отражает, как «имена инд.» Связаны общим «инст.». Я очень новичок в R, и я попробовал несколько методов, включая разделение Df.1 на фреймы данных для отдельного "Inst" и затем применение следующих функций:

My_function <- function(y){
Inst <- subset(Df.1, grepl(y, Df.1$`Inst.Id`))
+ return(Inst)
+ }

my_list <- c("A", "B", "C")

for(i in my_list){
Inst <- My_function(i)
assign(paste("Inst", i, sep = "."), Inst)
}

А затем получение ссылок на основании:

My_function2 <- function(x){
Df.C <- data.frame("Ind. Name"= C$`Ind`[x], "Linked Ind.Id"= C$`Linked Ind.Id*`[-(x)], "Linked Ind."= C$`Linked Ind.`[-(x)], "Inst"="C","Inst.ID*"=890)

Так что с помощью цикла

for(i in 1:4){
Network <- My_function2(i)
assign(paste("Network", i, sep = ".")

Результаты в четырех фреймах данных:

Network.1:

 “Ind. Name” “Ind.ID”  “Linked Ind.” “Linked Ind.ID” “Inst” “Inst.ID”
  S. Mathews  12351    P. Rawles         12351         C      890
  S. Mathews  12351    P. Right          12352         C      890
  S. Mathews  12351    O. Stray          12353         C      890

Сеть.2:

    “Ind. Name” “Ind.ID”  “Linked Ind.” “Linked Ind.ID” “Inst” “Inst.ID”
      P. Rawles   12351    P. Right          12352         C      890
      P. Rawles   12351    S. Mathews        12351         C      890   
      P. Rawles   12351    O. Stray          12353         C      890

Network.3:

     “Ind. Name” “Ind.ID”  “Linked Ind.” “Linked Ind.ID” “Inst” “Inst.ID”
      P. Right    12352    O. Stray          12353         C      890
      P. Right    12352    P. Rawles         12351         C      890
      P. Right    12352    S. Mathews        12351         C      890

Сеть.4:

     “Ind. Name” “Ind.ID”  “Linked Ind.” “Linked Ind.ID” “Inst” “Inst.ID”
      O. Stray    12353    P. Right          12352         C      890
      O. Stray    12353    P. Rawles         12351         C      890
      O. Stray    12353    S. Mathews        12351         C      890

Учитывая, что у меня 4 000 различных "Inst" и 8 000 "Ind.", Это, конечно, очень неэффективно, поэтому я был бы признателен за любую помощь или советы о том, как это может быть достигнуто функциональным способом в R

Спасибо

1 Ответ

0 голосов
/ 27 апреля 2018

Полагаю, ваша главная цель - воспроизвести Df.Result. Вы можете добиться этого с помощью простого внешнего соединения, используя dplyr::full_join.

library(tidyverse);
full_join(df, df, by = "Inst") %>%
    filter(Ind..Name.x != Ind..Name.y)
#   Ind..Name.x Ind..ID.x Inst Inst..ID.x Ind..Name.y Ind..ID.y Inst..ID.y
#1     J. Smith     12345    A        532  K. Kapplan     12346        532
#2     J. Smith     12345    A        532    A. Lindt     12347        532
#3   K. Kapplan     12346    A        532    J. Smith     12345        532
#4   K. Kapplan     12346    A        532    A. Lindt     12347        532
#5     A. Lindt     12347    A        532    J. Smith     12345        532
#6     A. Lindt     12347    A        532  K. Kapplan     12346        532
#7   B. Johnson     12348    B        761     E. Pitt     12349        761
#8      E. Pitt     12349    B        761  B. Johnson     12348        761
#9   S. Mathews     12351    C        890   P. Rawles     12351        890
#10  S. Mathews     12351    C        890    P. Right     12352        890
#11  S. Mathews     12351    C        890    O. Stray     12353        890
#12   P. Rawles     12351    C        890  S. Mathews     12351        890
#13   P. Rawles     12351    C        890    P. Right     12352        890
#14   P. Rawles     12351    C        890    O. Stray     12353        890
#15    P. Right     12352    C        890  S. Mathews     12351        890
#16    P. Right     12352    C        890   P. Rawles     12351        890
#17    P. Right     12352    C        890    O. Stray     12353        890
#18    O. Stray     12353    C        890  S. Mathews     12351        890
#19    O. Stray     12353    C        890   P. Rawles     12351        890
#20    O. Stray     12353    C        890    P. Right     12352        890

Объяснение: Выполнить внешнее соединение df с самим собой с помощью ID и удалить строки с одинаковыми Ind.Name s.


Пример данных

df <- read.table(text =
    "'Ind. Name'         'Ind. ID'        'Inst'    'Inst. ID'
'J. Smith'             12345               A           532
'K. Kapplan'           12346               A           532
'A. Lindt'             12347               A           532
'B. Johnson'           12348               B           761
'E. Pitt'              12349               B           761
'S. Mathews'           12351               C           890
'P. Rawles'            12351               C           890
'P. Right'             12352               C           890
'O. Stray'             12353               C           890", header = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...