รวมโหนดในรายการขอบที่มีระดับเกินเป็น 0 ใน igraph

ฉันกำลังติดตามคำถามก่อนหน้าที่ฉันถามที่นี่: การคำนวณอัตราส่วนของความสัมพันธ์แบบตอบแทนสำหรับแต่ละโหนดใน igraph

คำตอบมีประโยชน์มาก แต่ฉันรู้ว่าการคำนวณข้อหนึ่งไม่ถูกต้อง ฉันกำลังพยายามหาอัตราส่วนของความได้เปรียบแบบตอบแทนต่อระดับที่สูงกว่า กล่าวคือ เปอร์เซ็นต์ของผู้ที่ฉันเสนอให้เป็นเพื่อนเสนอชื่อฉันเป็นเพื่อนมีกี่เปอร์เซ็นต์

เมื่อนักเรียนไม่เสนอชื่อเพื่อน (ระดับเกินคือ 0) พวกเขาจะไม่รวมอยู่ในการคำนวณความสัมพันธ์แบบตอบแทนของฉัน เนื่องจากไม่สามารถมีความสัมพันธ์แบบตอบแทนได้ ฉันจึงต้องการให้คำนวณความสัมพันธ์ต่างตอบแทนเป็น 0 อัตราส่วนของความสัมพันธ์แบบตอบแทน/ระดับนอกควรเป็น 0 เช่นกัน

นี่คือตัวอย่าง:

library(igraph)    

###Creating sample edgelist###
from<- c("A", "A", "A", "B", "B", "B", "C", "D", "D", "E")
to<- c("B", "C", "D", "A", "E", "D", "A", "B", "C", "E")
weight<- c(1,2,3,2,1,3,2,2,1,1)
g2<- as.matrix(cbind(from,to, weight))

###Converting edgelist to network###
g3=graph.edgelist(g2[,1:2])
E(g3)$weight=as.numeric(g2[,3])

###Removing self-loop###
g3<-simplify(g3, remove.loops = T)

ตรงนี้ ระดับปริญญาของ E คือ 1 และระดับนอกเป็น 0 ฉันสร้างวงวนตัวเองสำหรับ E ดังนั้นเวกเตอร์ระดับปริญญาและระดับนอกยังคงมีความยาวเท่ากัน แล้วจึงเอามันออก

ต่อไป ฉันจะดูว่าการเสนอชื่อใดบ้างที่ได้รับการเสนอชื่อกลับ:

recip<-is.mutual(g3)
recip<-as.data.frame(recip)

จากนั้นฉันสร้างรายการขอบจาก g3 และเพิ่ม recip ลงในกรอบข้อมูล:

###Creating edgelist and adding recipe###
edgelist<- get.data.frame(g3, what = "edges")
colnames(edgelist)<- c("from", "to", "weight")

edgelist<- cbind(edgelist, recip)
edgelist

> edgelist
  from to weight recip
1    A  B      1  TRUE
2    A  C      2  TRUE
3    A  D      3 FALSE
4    B  A      2  TRUE
5    B  D      3  TRUE
6    B  E      1 FALSE
7    C  A      2  TRUE
8    D  B      2  TRUE
9    D  C      1 FALSE

นี่คือจุดที่ปัญหาเริ่มต้นขึ้น เนื่องจาก E ไม่ได้อยู่ใน from จึงไม่อยู่ในวัตถุที่ฉันสร้างด้านล่างด้วย

ต่อไป ฉันสร้างตารางที่มี outdegree และเพิ่มชื่อจุดยอด:

##Creating outdegree and adding vertex IDs##
outdegree<- as.data.frame(degree(g3, mode="out"))

ID<-V(g3)$name
outdegree<-cbind(ID, outdegree)
colnames(outdegree) <- c("ID","outdegree")
rownames(outdegree)<-NULL
outdegree

Outdegree ออกมาตามที่ฉันต้องการ:

 ID outdegree
1  A         3
2  B         3
3  C         1
4  D         2
5  E         0

เมื่อฉันคำนวณจำนวนความสัมพันธ์แบบตอบแทนสำหรับแต่ละโหนด จะไม่รวม E เนื่องจากฉันใช้คอลัมน์ from จาก edgelist ที่ฉันกล่าวถึงข้างต้น

##Calculating number of reciprocated ties##
recip<-aggregate(recip~from,edgelist,sum)
colnames(recip)<- c("ID", "recip")
recip

> recip
  ID recip
1  A     2
2  B     2
3  C     1
4  D     1

นั่นคือปัญหาที่เกิดขึ้น หากพยายามสร้างตารางที่มีอัตราส่วนของความสัมพันธ์แบบตอบแทนต่อระดับนอก E จะไม่รวมอยู่ด้วย:

##Creating ratio table##
ratio<-merge(recip, outdegree, by= "ID")
ratio<-as.data.frame (recip$recip/ratio$outdegree)
ratio<- cbind(recip$ID, ratio)
colnames(ratio)<- c("ID", "ratio")
ratio

  ID     ratio
1  A 0.6666667
2  B 0.6666667
3  C 1.0000000
4  D 0.5000000

ท้ายที่สุดแล้ว ฉันต้องการแถวใน ratio สำหรับ E ที่เท่ากับ 0 เนื่องจากอัตราส่วนตรงนี้จะเป็น 0/0 (0 ความสัมพันธ์แบบตอบแทน/0 องศานอก) ฉันอาจจะได้ NaN แต่ฉันสามารถแปลงมันเป็น 0 ได้อย่างง่ายดาย ดังนั้น คงจะไม่เป็นไร

ฉันสามารถแก้ไขปัญหานี้และส่งออกข้อมูลไปยัง Excel ดำเนินการคำนวณด้วยตนเอง และทำให้มันง่าย แต่นั่นไม่ได้ช่วยพัฒนาทักษะการเขียนโค้ดของฉัน และฉันมีเครือข่ายมากมายให้ใช้งาน ดังนั้นจึงค่อนข้างไม่มีประสิทธิภาพเช่นกัน

มีความคิดเห็นเกี่ยวกับวิธีทำให้สิ่งนี้เป็นแบบอัตโนมัติหรือไม่

ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ


person Gary DeYoung    schedule 02.08.2018    source แหล่งที่มา


คำตอบ (1)


E ไม่แสดงขึ้นมาเนื่องจาก E ไม่ได้อยู่ในคอลัมน์ from ในกรอบข้อมูล recip! อยู่ใน to เท่านั้น

คุณสามารถ aggregate บนทั้งสองคอลัมน์แล้วรวมเข้าด้วยกัน

r1 <- aggregate(recip~from,edgelist,sum)
colnames(r1) <- c("ID", "recip")
r2 <- aggregate(recip~to,edgelist,sum)
colnames(r2) <- c("ID", "recip")
recip <- merge(r1,r2, all = T) # all = T gives the union of the df's

ซึ่งจะช่วยให้:

  ID recip
1  A     2
2  B     2
3  C     1
4  D     1
5  E     0

นอกจากนี้ด้วยการวางท่อ:

library(dplyr)

edgelist %>% 
    aggregate(recip~from,.,sum) %>% 
    rename(ID = from) %>% 
    merge(., edgelist %>% 
                 aggregate(recip~to,.,sum) %>% 
                 rename(ID = to), 
          all = T)
person paqmo    schedule 02.08.2018
comment
สิ่งนี้มีประโยชน์จริงๆ--ขอบคุณ ฉันรู้ว่าปัญหาเกิดจากการที่ E ไม่ได้เข้ามา แต่ไม่แน่ใจว่าจะไปถึงที่นั่นได้อย่างไร - person Gary DeYoung; 03.08.2018
comment
ขออภัย โพสต์ก่อนเวลาอันควร และหมดเวลาในการแก้ไข ส่วนที่เหลือคือ: โซลูชันการวางท่อใช้งานได้อย่างมีเสน่ห์ ฉันมีคำถามเกี่ยวกับอันแรกแม้ว่า ดูเหมือนว่า r1 และ r2 จะรวมกันเข้าด้วยกัน นี่เป็นการพิมพ์ผิดหรือเปล่า? เมื่อฉันพยายามเขียนโค้ด r1 เพื่อรวม E ออกจากมันอีกครั้ง และเมื่อฉันรวม r1 และ r2 E จะถูกปล่อยออกจากเอาต์พุต ฉันจะใช้กลยุทธ์การวางท่ออย่างแน่นอน แต่ช่วยบอกฉันหน่อยได้ไหมว่าเกิดอะไรขึ้นกับแผนแรก ขอบคุณอีกครั้ง! - person Gary DeYoung; 03.08.2018
comment
@GaryDeYoung หากคำตอบนี้มีประโยชน์ อย่างน้อยคุณควรโหวตเห็นด้วย ถ้ามันตอบคำถามของคุณได้จริง โปรดยอมรับมันเป็นคำตอบ - person G5W; 03.08.2018
comment
@GaryDeYoung ใช่ นั่นเป็นตัวพิมพ์ผิด! นอกจากนี้ ให้เพิ่ม all = T ใน merge เพื่อให้แน่ใจว่าการสังเกตทั้งหมดจากทั้ง r1 และ r2 จะถูกเก็บไว้ - person paqmo; 03.08.2018
comment
@paqmo เข้าใจแล้ว! ทั้งหมดนี้สมเหตุสมผลแล้ว ยังไงก็ยอมรับคำตอบแล้วกัน ขอโทษที่ล่าช้า. - person Gary DeYoung; 03.08.2018