阅读权限 255 威望 0 级论坛币 1815 个 通用积分 98.3943 学术水平 134 点 热心指数 183 点 信用等级 88 点 经验 23214 点 帖子 584 精华 0 在线时间 1523 小时 注册时间 2011-1-18 最后登录 2024-12-13
感觉可以不用循环
尝试了下, 过程比较狗血
其想法是把 school 数字化factor(且对于ID),A和T(A),相乘变矩阵,矩阵的列可以理解为school或者ID,行也是school或者ID,如果同校数值相同,则sqrt(此矩阵)为school的数值(某整数)。此时取矩阵的对角线下部分整数即可,并得到坐标,从而找到对应的ID。
而在sqrt()时,2*2,3*3,4*4,,,同校,但要避免1*4,2*8这类的数sqrt()也为整数,但并不同校,可采取 数值-0.1的变通下,sqrt(..-0.1)+0.1...
data <- read.csv(text="id,school
id1,人大
id2,清华
id3,北大
id4,剑桥
id5,哈佛
id6,耶鲁
id7,复旦
id8,人大
id9,清华
id10,哈佛
id11,耶鲁
id12,复旦
id13,人大
id14,清华
id15,交大
id16,交大
id17,哈佛
id18,耶鲁
id19,复旦
id20,上外
id21,人大
id22,清华
id23,中大
id24,南大
id25,人大
id26,清华
id27,哈佛
id28,耶鲁
id29,复旦
id30,南大",header=T)
data<- data[order(data$school),]
sch=factor(data$school)
sch=as.numeric(sch)-0.1#数值化整为小数
mat<-sch%*%t(sch) #矩阵
mat[!(sqrt(mat)+0.1)%%1==0]=0
mat[(sqrt(mat)+0.1)%%1==0]=1
mat #此矩阵数值为1的为彼此 同校, 对角线为自身
dat<-which(mat==1,arr.ind=T)
dat<- as.data.frame(dat)
dat1<-dat[dat$row>dat$col,]#取对角线下部分的取值
data1<-data.frame(id.1=data[dat1$col,1],id.2=data[dat1$row,1],value=rep(T,length(dat1$col)))
data1[order(data1$id.1),] 复制代码 命名、细节有些糙 有补充的吗?
总评分: 学术水平 + 1
热心指数 + 1
查看全部评分