用R语言呈现人拉人模式的关系网数据

最近公司正在做一个基于熟人关系网络的投顾系统,数据库里面有一个基础的拉人注册表,描述了注册者和他的上级的从属关系,是一级关系。

但是公司基于业务需要,需要对每一个人的上下线关系进行梳理这样就必须要有一个表,我的第一反应是这个表太简单了,不就是上下级关系吗?结果,我被打脸了,实际情况没那么简单,因为邀请表里面是一张表,包含了所有的邀请关系,如果邀请级别有20级,数量有十万,那跑一次循环就是十万的平方级别,计算量超级大。

闲话少说,我先拿少量数据来试试手,第一批拿出来的是约1000个邀请关系,数据截图如下:



我需要将这些数据转化为大约十级的邀请关系,首先我必须考虑好这些数据以什么方式呈现出来,最好的方式是什么呢?

最好的方式我想到是树状图,但是树状图用excel表格不好表示,只能以画图的形式呈现,想要对结果进行深层次分析会有阻碍。

想来想去,只能以一条条数据来呈现了,就是一行显示从一级到十级每一级用户的信息,如果从1级到9级都是同样的人,就十级不同,也要显示两条数据。


这里实际上有两种实现思路,一种是从第一级找到源头,然后顺藤摸瓜把整个第一级的下属人员找出来,是找树的思维,从整体到微观;

另外一种是,找到最后级别的人,逆向寻找上级,形成一条条数据,是找每一行的思维,从微观到整体。


目前我编写的R语言是从整体到个体的代码,具体代码如下:

library(Matrix)


rhd<-read.csv("f:/Rdata/rhd/rhdgx.csv",header = F,encoding = 'utf8',na.string='NA')
#对数据集要求为第一行无列名


num1<-as.character(setdiff(rhd[,1],rhd[,3]))
#找出邀请人和被邀请人的非交集,作为character格式存储,方便循环比较


R12<-matrix(0,1,3)
#初始化数据集,用来记录一级拉人关系


for (z1 in 1:nrow(rhd)){
  for (z2 in 1:length(num1))
    try({if (rhd[z1,1]==num1[z2]) 
    {
        R1=rhd[z1,]
        R12<-rbind(R12,R1)}
    },silent = T)
}
R12<-R12[-1,]
R12[is.na(R12)]<-0


num12<-as.character(unique(R12[,3]))
#找出2级拉人者的ID,作为character格式存储,方便循环比较


R23<-matrix(0,1,3)
#初始化数据集,用来记录2级拉人关系


for (z1 in 1:nrow(rhd)){
  for (z2 in 1:length(num12))
    try({if (rhd[z1,1]==num12[z2]) 
    {
      R1=rhd[z1,]
      R23<-rbind(R23,R1)}
    },silent = T)
}
R23<-R23[-1,]
R23[is.na(R23)]<-0






R123<-matrix(0,1,5)
#初始化数据集,用来记录2级拉人关系
for (z1 in 1:nrow(R12)){
  for (z2 in 1:nrow(R23))
    try({if (R12[z1,3]==R23[z2,1]) 
    { R1=cbind(R12[z1,],R23[z2,2:3])
      R123<-rbind(R123,as.matrix(R1))}
        },silent = F)
}
R123<-R123[-1,]




for (z1 in 1:nrow(R12))
    try({if (R12[z1,3]==0) 
    { R1=cbind(R12[z1,],matrix(0,1,2))
    R123<-rbind(as.matrix(R1),R123)}
    },silent = F)
#将未拉人的一级投资者并入到2级拉人表格中
R123[is.na(R123)]<-0




num123<-as.character(unique(R23[,3]))
#找出3级拉人者的ID,作为character格式存储,方便循环比较


R34<-matrix(0,1,3)
#初始化数据集,用来记录3级拉人关系


for (z1 in 1:nrow(rhd)){
  for (z2 in 1:length(num123))
    try({if (rhd[z1,1]==num123[z2]) 
    {
      R1=rhd[z1,]
      R34<-rbind(R34,R1)}
    },silent = T)
}
R34<-R34[-1,]
R34[is.na(R34)]<-0






R1234<-matrix(0,1,7)
#初始化数据集,用来记录3级拉人关系
for (z1 in 1:nrow(R123)){
  for (z2 in 1:nrow(R34))
    try({if (R123[z1,5]==R34[z2,1]) 
    {
      R1=cbind(t(R123[z1,]),R34[z2,2:3])
      R1234<-rbind(R1234,as.matrix(R1))}
    }
    ,silent = F)
}
R1234<-R1234[-1,]




for (z1 in 1:nrow(R123))
  try({if (R123[z1,5]==0) 
  { R1=cbind(t(R123[z1,]),matrix(0,1,2))
  R1234<-rbind(as.matrix(R1),R1234)}
  },silent = F)
#将未拉人的投资者并入到3级拉人表格中
R1234[is.na(R1234)]<-0




num1234<-as.character(unique(R34[,3]))
#找出4级拉人者的ID,作为character格式存储,方便循环比较


R45<-matrix(0,1,3)
#初始化数据集,用来记录4级拉人关系


for (z1 in 1:nrow(rhd)){
  for (z2 in 1:length(num1234))
    try({if (rhd[z1,1]==num1234[z2]) 
    {
      R1=rhd[z1,]
      R45<-rbind(R45,R1)}
    },silent = T)
}
R45<-R45[-1,]
R45[is.na(R45)]<-0






R12345<-matrix(0,1,9)
#初始化数据集,用来记录4级拉人关系
for (z1 in 1:nrow(R1234)){
  for (z2 in 1:nrow(R45))
    try({if (R1234[z1,7]==R45[z2,1]) 
    {
      R1=cbind(t(R1234[z1,]),R45[z2,2:3])
      R12345<-rbind(R12345,as.matrix(R1))}
    }
    ,silent = F)
}
R12345<-R12345[-1,]


for (z1 in 1:nrow(R1234))
  try({if (R1234[z1,7]==0) 
  { R1=cbind(t(R1234[z1,]),matrix(0,1,2))
  R12345<-rbind(as.matrix(R1),R12345)}
  },silent = F)
#将未拉人的投资者并入到4级拉人表格中
R12345[is.na(R12345)]<-0


num12345<-as.character(unique(R45[,3]))
#找出5级拉人者的ID,作为character格式存储,方便循环比较


R56<-matrix(0,1,3)
#初始化数据集,用来记录5级拉人关系


for (z1 in 1:nrow(rhd)){
  for (z2 in 1:length(num12345))
    try({if (rhd[z1,1]==num12345[z2]) 
    {
      R1=rhd[z1,]
      R56<-rbind(R56,R1)}
    },silent = T)
}
R56<-R56[-1,]
R56[is.na(R56)]<-0






R123456<-matrix(0,1,11)
#初始化数据集,用来记录5级拉人关系
for (z1 in 1:nrow(R12345)){
  for (z2 in 1:nrow(R56))
    try({if (R12345[z1,9]==R56[z2,1])
    {
      R1=cbind(t(R12345[z1,]),R56[z2,2:3])
      R123456<-rbind(R123456,as.matrix(R1))}
    }
    ,silent = F)
}
R123456<-R123456[-1,]


for (z1 in 1:nrow(R12345))
  try({if (R12345[z1,9]==0) 
  { R1=cbind(t(R12345[z1,]),matrix(0,1,2))
  R123456<-rbind(as.matrix(R1),R123456)}
  },silent = F)
#将未拉人的投资者并入到5级拉人表格中
R123456[is.na(R123456)]<-0


num123456<-as.character(unique(R56[,3]))
#找出6级拉人者的ID,作为character格式存储,方便循环比较
R67<-matrix(0,1,3)
#初始化数据集,用来记录6级拉人关系


for (z1 in 1:nrow(rhd)){
  for (z2 in 1:length(num123456))
    try({if (rhd[z1,1]==num123456[z2]) 
    {
      R1=rhd[z1,]
      R67<-rbind(R67,R1)}
    },silent = T)
}
R67<-R67[-1,]
R67[is.na(R67)]<-0






R1234567<-matrix(0,1,13)
#初始化数据集,用来记录6级拉人关系
for (z1 in 1:nrow(R123456)){
  for (z2 in 1:nrow(R67))
    try({if (R123456[z1,11]==R67[z2,1]) 
    {
      R1=cbind(t(R123456[z1,]),R67[z2,2:3])
      R1234567<-rbind(R1234567,as.matrix(R1))}
    }
    ,silent = F)
}
R1234567<-R1234567[-1,]


for (z1 in 1:nrow(R123456))
  try({if (R123456[z1,11]==0) 
  { R1=cbind(t(R123456[z1,]),matrix(0,1,2))
  R1234567<-rbind(as.matrix(R1),R1234567)}
  },silent = F)
#将未拉人的投资者并入到6级拉人表格中
R1234567[is.na(R1234567)]<-0


num1234567<-as.character(unique(R67[,3]))
#找出7级拉人者的ID,作为character格式存储,方便循环比较


R78<-matrix(0,1,3)
#初始化数据集,用来记录7级拉人关系


for (z1 in 1:nrow(rhd)){
  for (z2 in 1:length(num1234567))
    try({if (rhd[z1,1]==num1234567[z2]) 
    {
      R78<-rbind(R78,rhd[z1,])}
    },silent = F)
}
R78<-R78[-1,]
R78[is.na(R78)]<-0


R12345678<-matrix(0,1,15)
#初始化数据集,用来记录7级拉人关系
for (z1 in 1:nrow(R1234567)){
  for (z2 in 1:nrow(R78))
    try({if (R1234567[z1,13]==R78[z2,1]) 
    {
      R1=cbind(t(R1234567[z1,]),R78[z2,2:3])
      R12345678<-rbind(R12345678,as.matrix(R1))}
    }
    ,silent = F)
}
R12345678<-R12345678[-1,]


for (z1 in 1:nrow(R1234567))
  try({if (R1234567[z1,13]==0) 
  { R1=cbind(t(R1234567[z1,]),matrix(0,1,2))
  R12345678<-rbind(as.matrix(R1),R12345678)}
  },silent = F)
#将未拉人的投资者并入到7级拉人表格中
R12345678[is.na(R12345678)]<-0




#目前钱串只到第八级,暂无后面的数据,2016-8-22
num12345678<-as.character(unique(R78[,3]))
#找出8级拉人者的ID,作为character格式存储,方便循环比较
R89<-matrix(0,1,3)
#初始化数据集,用来记录8级拉人关系


for (z1 in 1:nrow(rhd)){
  for (z2 in 1:length(num12345678))
    try({if (rhd[z1,1]==num12345678[z2]) 
    {
      R1=rhd[z1,]
      R89<-rbind(R89,R1)}
    },silent = T)
}
R89<-R89[-1,]
R89[is.na(R89)]<-0


R123456789<-matrix(0,1,17)
#初始化数据集,用来记录8级拉人关系
for (z1 in 1:nrow(R12345678)){
  for (z2 in 1:nrow(R89))
    try({if (R12345678[z1,15]==R89[z2,1]) 
    {
      R1=cbind(t(R12345678[z1,]),R89[z2,2:3])
      R123456789<-rbind(R123456789,as.matrix(R1))}
    }
    ,silent = F)
}
R123456789<-R123456789[-1,]


for (z1 in 1:nrow(R12345678))
  try({if (R12345678[z1,15]==0) 
  { R1=cbind(t(R12345678[z1,]),matrix(0,1,2))
  R123456789<-rbind(as.matrix(R1),R123456789)}
  },silent = F)
#将未拉人的7级投资者并入到8级拉人表格中
R123456789[is.na(R123456789)]<-0


num123456789<-as.character(unique(R89[,3]))
#找出9级拉人者的ID,作为character格式存储,方便循环比较
R90<-matrix(0,1,3)
#初始化数据集,用来记录9级拉人关系


for (z1 in 1:nrow(rhd)){
  for (z2 in 1:length(num123456789))
    try({if (rhd[z1,1]==num123456789[z2]) 
    {
      R1=rhd[z1,]
      R90<-rbind(R90,R1)}
    },silent = T)
}
R90<-R90[-1,]
R90[is.na(R90)]<-0


R1234567890<-matrix(0,1,19)
#初始化数据集,用来记录9级拉人关系
for (z1 in 1:nrow(R123456789)){
  for (z2 in 1:nrow(R90))
    try({if (R123456789[z1,17]==R90[z2,1]) 
    {
      R1=cbind(t(R123456789[z1,]),R90[z2,2:3])
      R1234567890<-rbind(R1234567890,as.matrix(R1))}
    }
    ,silent = F)
}
R1234567890<-R1234567890[-1,]


for (z1 in 1:nrow(R123456789))
  try({if (R123456789[z1,17]==0) 
  { R1=cbind(t(R123456789[z1,]),matrix(0,1,2))
  R1234567890<-rbind(as.matrix(R1),R1234567890)}
  },silent = F)
#将未拉人的投资者并入到9级拉人表格中
R1234567890[is.na(R1234567890)]<-0


这个语句是按照一级一级递进写出来的,从一级开始到最后一级,如果中间没有级数会报错。结果如下:


这里面会有一个问题,就是随着数据量增大,我必须在后面不断添加每一个级别的代码,如果级别无限大,理论上这个代码是无限长的,严重制约了代码的可复用性,我现在正在针对这个代码进行优化,大家如果有什么好的想法可以直接跟我讨论,后续我做出优化代码之后,也会把优化的代码发出来供大家参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值