楼主: sosmall1181
8726 42

[问答] R语言矩阵计算 [推广有奖]

21
sosmall1181 发表于 2013-11-29 16:56:37
qoiqpwqr 发表于 2013-11-25 18:48
请教一下, 能用apply函数替代那个循环么,不用combn函数。

22
jmpamao 发表于 2013-11-29 21:07:54
sosmall1181 发表于 2013-11-29 16:56
请教一下, 能用apply函数替代那个循环么,不用combn函数。
apply不是用那种格式的,最少我没见过。我把之前的运用 matrix的方法改了下。觉得ok
  1. x <- matrix(c("A","B","C","D","E","人大,北大,剑桥","交大","人大,清华","清华","蓝翔"),ncol=2);x
  2. ##通过矩阵建立ID间关系,矩阵的下部分的点为ID相交的唯一点,画图可知(行ID,列ID)
  3. num<-1:length(x[,1])
  4. mat <-num%*%t(num)#或者直接改 mat <- matrix(rep(1,length(x[,1])*length(x[,1])),ncol=length(x[,1]))
  5. dat <- as.data.frame(which(mat>0,arr.ind=T))
  6. dat1<- dat[dat$row >dat$col,]
  7. data2<-data.frame(ID1=x[dat1$col,1],ID2=x[dat1$row,1])
  8. data2

  9. ##建立ID排列关系后,再判断value。
  10. dat2<-apply(data2,1,function(i){
  11.   any(unlist(strsplit(x[which(x==i[1]),2],split=","))%in%unlist(strsplit(x[which(x==i[2]),2],split=",")))
  12. })
  13. dat.new<-as.data.frame(cbind(data2,dat2))
  14. dimnames(dat.new)[[2]]<-c("ID1","ID2","VALUE")
  15. dat.new


  16. ##这个方法可不用combn,不用循环
  17. ##但会极大牺牲内存空间换取运行速度
  18. ##combn内置了choose(),while()循环写的很厉害,思想真holy sh!t.
  19. ##for循环,combn, matrix 3中方法都system.time()比较后
  20. ##速度matrix  >   combn >   > for
  21. ##占用空间  matrix >     > combn > for
复制代码

23
nuomin 发表于 2013-11-30 11:34:39
不用combn函数的,纯纯的矩阵
  1. x <- matrix(c("A","B","C","D","E","rmb","zkj","rmb","zkj","rmb"),ncol=2)
  2. dimnames(x)[[2]] <- c("id","name")
  3. charvec <- character(nrow(x)*nrow(x)*(ncol(x)+ncol(x)))
  4. c_matrix <- matrix(charvec,nrow=nrow(x)*nrow(x))
  5. c_matrix[,1:2] <-apply(x,2,rep,each=nrow(x))
  6. c_matrix[,3:4] <-apply(x,2,rep,each=1,times=nrow(x))
  7. z <- seq(1:nrow(x))
  8. seq_gener <- function(y,nrowx){
  9.   nrowx*(y-1)+seq(1:y)
  10. }
  11. del_list<- lapply(z,FUN=seq_gener,nrowx=nrow(x))
  12. del_array <- -array(unlist(del_list))
  13. c_matrix_compact <- c_matrix[del_array,]
  14. result_matrix <- cbind(c_matrix_compact[,c(1,3)],
  15.                        ifelse(c_matrix_compact[,2]==c_matrix_compact[,4],"yes","no"))
  16. dimnames(result_matrix)[[2]] <- c("id1","id2","yes or no")
  17. result_matrix
复制代码


已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jmpamao + 1 + 1 + 1 中间 排除的地方 很妙

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

24
jmpamao 发表于 2013-11-30 13:48:15
nuomin 发表于 2013-11-30 11:34
不用combn函数的,纯纯的矩阵
  1. z <- seq(1:nrow(x))
  2. seq_gener <- function(y,nrowx){
  3.   nrowx*(y-1)+seq(1:y)
  4. }
  5. del_list<- lapply(z,FUN=seq_gener,nrowx=nrow(x))
复制代码
这部分 你是怎么想到的?怎么推出来的

25
jgchen1966 发表于 2013-12-1 01:35:48
其实, 这仅是一个查询任务,可用dlply() 非常简单的现实:
dat<- matrix(c("A","B","C","rmb","zkj","rmb"),ncol=2)
dat<-as.data.frame(dat,stringsAsFactors=FALSE)
names(dat)<-c("ID","School")
datnew<-dlply(dat,.(School),f=ID)
查询结果:

> datnew$rmb
  ID School
1  A    rmb
2  C    rmb
> datnew$zkj
  ID School
1  B    zkj
>

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jmpamao + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

鹑居鷇食,鸟行无彰

26
nuomin 发表于 2013-12-1 08:35:46
jmpamao 发表于 2013-11-30 13:48
这部分 你是怎么想到的?怎么推出来的
看c_matrix矩阵总结的
已有 1 人评分热心指数 收起 理由
jmpamao + 1

总评分: 热心指数 + 1   查看全部评分

27
sosmall1181 发表于 2013-12-2 10:28:40
nuomin 发表于 2013-12-1 08:35
看c_matrix矩阵总结的
不知道在R中能不能实现一个功能,就是如果A有多个学校,存在不同的行里,能不能将这些记录合并为一行,学校中间用,或其他符号区隔

28
jmpamao 发表于 2013-12-2 13:06:42
sosmall1181 发表于 2013-12-2 10:28
不知道在R中能不能实现一个功能,就是如果A有多个学校,存在不同的行里,能不能将这些记录合并为一行,学 ...
  1. dat <- data.frame(id=c("A","A","B","C","A"),school=c("rmu","beiu","haru","qingh","kkk"))
  2. aggregate(school~id,data=dat,function(i)paste(i,collapse=","))##formula 以ID分类school,
复制代码

29
sosmall1181 发表于 2013-12-2 14:42:38
jmpamao 发表于 2013-12-2 13:06
谢谢。
我现在想做的是将相同的学校找出来,数据last如下:
1.jpg
apply(last,1,function(i){intersect(unlist(strsplit(as.character(i[2]),split=",")),unlist(strsplit(as.character(i[6]),split=",")))})
但是学校出来的格式不对,
数据结果

30
jmpamao 发表于 2013-12-2 15:10:37
sosmall1181 发表于 2013-12-2 14:42
谢谢。
我现在想做的是将相同的学校找出来,数据last如下:
语法应该没有什么问题,  会不会这个细节  比如  人民大学,清华大学 #中文的逗号。此时方便的改法 可以 split=","#中文的逗号。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 17:41