ฉันกำลังติดตามคำถามก่อนหน้าที่ฉันถามที่นี่: การคำนวณอัตราส่วนของความสัมพันธ์แบบตอบแทนสำหรับแต่ละโหนดใน 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 ดำเนินการคำนวณด้วยตนเอง และทำให้มันง่าย แต่นั่นไม่ได้ช่วยพัฒนาทักษะการเขียนโค้ดของฉัน และฉันมีเครือข่ายมากมายให้ใช้งาน ดังนั้นจึงค่อนข้างไม่มีประสิทธิภาพเช่นกัน
มีความคิดเห็นเกี่ยวกับวิธีทำให้สิ่งนี้เป็นแบบอัตโนมัติหรือไม่
ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ