楼主: sosmall1181
8725 42

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

  • 0关注
  • 0粉丝

高中生

27%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
432 点
帖子
26
精华
0
在线时间
26 小时
注册时间
2007-3-27
最后登录
2021-11-23

楼主
sosmall1181 发表于 2013-11-25 15:23:06 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
大家好,我手里有一个矩阵, 原始数据

想计算两个人是否毕业于同一个学校。
最后的结果应该是
用户1

用户2

是否毕业于同一学校

A

B

A

C

B

C

用R该怎么写?多谢~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R语言 大家好 学校 用户

已有 1 人评分热心指数 收起 理由
qoiqpwqr + 1 鼓励积极发帖讨论

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

沙发
nuomin 发表于 2013-11-25 17:21:44
这是mysql的专长,用R做不太合适,速度慢,内存消耗高

藤椅
sosmall1181 发表于 2013-11-25 18:08:04
nuomin 发表于 2013-11-25 17:21
这是mysql的专长,用R做不太合适,速度慢,内存消耗高
哦,多谢。我写的循环
n <- length(y <- matrix(x[,1]))
y <- matrix(0,nrow=3,ncol=3)
for (i in (1:(n-1))) {
for (j in (1:(n-i))){
  relation <- length(intersect(x[i,2],x[i+j,2]))/length(union(x[i,2],x[i+j,2]))
  #print (x[n,2])
print(x[i,1])
print(x[i+j,1])
print(relation)
}
}

板凳
qoiqpwqr 发表于 2013-11-25 18:48:34
  1. dat <- data.frame(ID = LETTERS[1:10], school = sample(c("School 1", "School 2", "School 3"), size = 10, replace = TRUE))

  2. schools <- dat[, 2]
  3. IDs <- dat[, 1]
  4. n <- nrow(dat)
  5. output <- NULL
  6. for (i in 1:(n-1)) {
  7.     ID1 <- IDs[i]
  8.     school1 <- schools[i]
  9.     ID2 <- IDs[(i+1):n]
  10.     school2 <- schools[(i+1):n]
  11.     relation <- school2 %in% school1
  12.     newoutput <- data.frame(ID1 = ID1, ID2 = ID2, Relation = relation)
  13.     output <- rbind(output, newoutput)
  14. }
复制代码
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
ryusukekenji + 1 热心帮助其他会员
jmpamao + 1 + 1 + 1 热心帮助其他会员

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

报纸
sosmall1181 发表于 2013-11-26 09:39:55
qoiqpwqr 发表于 2013-11-25 18:48
谢谢,写得太专业了,感觉我的思维还没有转到R上面来

地板
jmpamao 发表于 2013-11-26 23:22:15
感觉可以不用循环
尝试了下, 过程比较狗血
其想法是把 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...
  1. data <- read.csv(text="id,school
  2. id1,人大
  3. id2,清华
  4.                  id3,北大
  5.                  id4,剑桥
  6.                  id5,哈佛
  7.                  id6,耶鲁
  8.                  id7,复旦
  9.                  id8,人大
  10.                  id9,清华
  11.                  id10,哈佛
  12.                  id11,耶鲁
  13.                  id12,复旦
  14.                  id13,人大
  15.                  id14,清华
  16.                  id15,交大
  17.                  id16,交大
  18.                  id17,哈佛
  19.                  id18,耶鲁
  20.                  id19,复旦
  21.                  id20,上外
  22.                  id21,人大
  23.                  id22,清华
  24.                  id23,中大
  25.                  id24,南大
  26.                  id25,人大
  27.                  id26,清华
  28.                  id27,哈佛
  29.                  id28,耶鲁
  30.                  id29,复旦
  31.                  id30,南大",header=T)

  32. data<- data[order(data$school),]
  33. sch=factor(data$school)
  34. sch=as.numeric(sch)-0.1#数值化整为小数
  35. mat<-sch%*%t(sch) #矩阵
  36. mat[!(sqrt(mat)+0.1)%%1==0]=0
  37. mat[(sqrt(mat)+0.1)%%1==0]=1
  38. mat #此矩阵数值为1的为彼此 同校, 对角线为自身
  39. dat<-which(mat==1,arr.ind=T)
  40. dat<- as.data.frame(dat)
  41. dat1<-dat[dat$row>dat$col,]#取对角线下部分的取值
  42. data1<-data.frame(id.1=data[dat1$col,1],id.2=data[dat1$row,1],value=rep(T,length(dat1$col)))
  43. data1[order(data1$id.1),]
复制代码
命名、细节有些糙  有补充的吗?

已有 1 人评分学术水平 热心指数 收起 理由
qoiqpwqr + 1 + 1 观点有启发

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

7
nuomin 发表于 2013-11-27 21:01:44
有R味道的代码要没有循环,以向量运算为主。我也来贴一段代码,比以上的简洁一些,简单一些。
  1. x <- matrix(c("A","B","C","rmb","zkj","rmb"),ncol=2)
  2. dimnames(x)[[2]] <- c("id","name")
  3. comb <- combn(nrow(x),2)
  4. col1 <- rep(as.vector(comb),each=2)
  5. col2 <- rep(c(1,2),times=length(col1)/2)
  6. elem <- matrix(cbind(col1,col2),ncol=2,byrow=F)
  7. match_m <- matrix(x[elem],ncol=4,byrow=T)
  8. result_m <- cbind(match_m[,c(1,3)],ifelse(match_m[,2]==match_m[,4],"yes","no"))
  9. dimnames(result_m)[[2]] <- c("id1","id2","yes or no")
  10. rm(x,comb,col1,col2,elem,match_m)
复制代码


已有 3 人评分学术水平 热心指数 信用等级 收起 理由
hayes + 1 + 1 + 1 观点有启发
qoiqpwqr + 1 热心帮助其他会员
jmpamao + 1 + 1 + 1 观点有启发

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

8
jmpamao 发表于 2013-11-27 22:50:38
nuomin 发表于 2013-11-27 21:01
有R味道的代码要没有循环,以向量运算为主。我也来贴一段代码,比以上的简洁一些,简单一些。
原来有 combn函数

那就更味儿一点的[titter]
  1. x <- matrix(c("A","B","C","rmb","zkj","rmb"),ncol=2)
  2. dat<-t(combn(x[,1],2))
  3. dat2<-apply(dat,1,function(i)x[which(x==i[1]),2]==x[which(x==i[2]),2])
  4. dat.new<-as.data.frame(cbind(dat,dat2))
  5. dimnames(dat.new)[[2]]<-c("id1","id2","yesorno")
  6. dat.new
复制代码
已有 1 人评分学术水平 收起 理由
nuomin + 1 观点有启发

总评分: 学术水平 + 1   查看全部评分

9
nuomin 发表于 2013-11-28 08:45:27
jmpamao 发表于 2013-11-27 22:50
原来有 combn函数

那就更味儿一点的
简洁、味儿浓,哈哈

10
sosmall1181 发表于 2013-11-28 10:13:10
nuomin 发表于 2013-11-28 08:45
简洁、味儿浓,哈哈
越来越看不懂了。。。

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

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