- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 1815 个
- 通用积分
- 98.3943
- 学术水平
- 134 点
- 热心指数
- 183 点
- 信用等级
- 88 点
- 经验
- 23214 点
- 帖子
- 584
- 精华
- 0
- 在线时间
- 1523 小时
- 注册时间
- 2011-1-18
- 最后登录
- 2024-12-13
|
sosmall1181 发表于 2013-11-29 16:56 
请教一下, 能用apply函数替代那个循环么,不用combn函数。 apply不是用那种格式的,最少我没见过。我把之前的运用 matrix的方法改了下。觉得ok - x <- matrix(c("A","B","C","D","E","人大,北大,剑桥","交大","人大,清华","清华","蓝翔"),ncol=2);x
- ##通过矩阵建立ID间关系,矩阵的下部分的点为ID相交的唯一点,画图可知(行ID,列ID)
- num<-1:length(x[,1])
- mat <-num%*%t(num)#或者直接改 mat <- matrix(rep(1,length(x[,1])*length(x[,1])),ncol=length(x[,1]))
- dat <- as.data.frame(which(mat>0,arr.ind=T))
- dat1<- dat[dat$row >dat$col,]
- data2<-data.frame(ID1=x[dat1$col,1],ID2=x[dat1$row,1])
- data2
- ##建立ID排列关系后,再判断value。
- dat2<-apply(data2,1,function(i){
- any(unlist(strsplit(x[which(x==i[1]),2],split=","))%in%unlist(strsplit(x[which(x==i[2]),2],split=",")))
- })
- dat.new<-as.data.frame(cbind(data2,dat2))
- dimnames(dat.new)[[2]]<-c("ID1","ID2","VALUE")
- dat.new
- ##这个方法可不用combn,不用循环
- ##但会极大牺牲内存空间换取运行速度
- ##combn内置了choose(),while()循环写的很厉害,思想真holy sh!t.
- ##for循环,combn, matrix 3中方法都system.time()比较后
- ##速度matrix > combn > > for
- ##占用空间 matrix > > combn > for
复制代码
|
|