楼主: dark293
6014 7

[问答] matrix shuffle in R [推广有奖]

  • 0关注
  • 0粉丝

高中生

82%

还不是VIP/贵宾

-

威望
0
论坛币
11 个
通用积分
0
学术水平
3 点
热心指数
5 点
信用等级
0 点
经验
289 点
帖子
20
精华
0
在线时间
37 小时
注册时间
2016-3-10
最后登录
2023-7-16

楼主
dark293 发表于 2020-5-24 15:29:35 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位好!
我手上有一个N*N的对称矩阵,请问如何在R中实现保持矩阵行、列名称不变,个体自身之间的值始终为0(对角线始终为0),打乱不同个体间的数值呢?如下图所示。我只会按行或列打乱数据,但那样的话,矩阵结构就变了(不再是对称矩阵),也不能保持对角线始终为0了。


烦请各位高手赐教,感激不尽!

174654qb949b2tyexwrqbo.png

二维码

扫码加我 拉你入群

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

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

关键词:shuffle matrix Mat 对称矩阵 感激不尽

沙发
megapanda 发表于 2020-5-25 00:56:09
既然是对称矩阵,你只需要打乱上三角或下三角的数据,另外一半直接按对称赋值就行了
给你一个参考
  1. x <- x1 <- matrix(numeric(25), nrow = 5)
  2. # 随便弄一个对称阵. lower.tri取下三角,详情看帮助文档
  3. x[lower.tri(x)] <- 1:10; x <- x + t(x)

  4. # 随机打乱
  5. x_ran = x[lower.tri(x)]
  6. x_ran <- sample(x_ran)
  7. x1[lower.tri(x)] <- x_ran; x1 <- x1 + t(x1)
复制代码


x和x1分别是
  1. > x
  2.      [,1] [,2] [,3] [,4] [,5]
  3. [1,]    0    1    2    3    4
  4. [2,]    1    0    5    6    7
  5. [3,]    2    5    0    8    9
  6. [4,]    3    6    8    0   10
  7. [5,]    4    7    9   10    0
  8. > x1
  9.      [,1] [,2] [,3] [,4] [,5]
  10. [1,]    0    9    4    7    1
  11. [2,]    9    0    2    5    3
  12. [3,]    4    2    0   10    6
  13. [4,]    7    5   10    0    8
  14. [5,]    1    3    6    8    0
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 热心帮助其他会员
cheetahfly + 10 热心帮助其他会员

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

藤椅
dark293 发表于 2020-5-25 02:23:43
megapanda 发表于 2020-5-25 00:56
既然是对称矩阵,你只需要打乱上三角或下三角的数据,另外一半直接按对称赋值就行了
给你一个参考
你好,非常感谢你的回复。我尝试了你发的代码,在做到x_ran = x[lower.tri(x)]这一步时,发现x_ran中的数值与最初的x矩阵中的数值不一样,然后回头再看原始矩阵,数据也变了呢请问您知道是咋回事吗?是不是x<-x+t(x)这一步出了问题?

板凳
megapanda 发表于 2020-5-25 09:58:42
dark293 发表于 2020-5-25 02:23
你好,非常感谢你的回复。我尝试了你发的代码,在做到x_ran = x[lower.tri(x)]这一步时,发现x_ran中的数 ...
代码前几行(一直到x <- x + t(x) )只是随便弄一个对称矩阵的。如果你自己已经有一个对称矩阵了,前面几行自然就不需要了

报纸
dark293 发表于 2020-5-25 11:32:58
megapanda 发表于 2020-5-25 09:58
代码前几行(一直到x
你好,我确实是用的自己的矩阵数据哈。
  x<-as.matrix(network)  #network是我的数据
  x_ran = x[lower.tri(x)]
  x_ran <- sample(x_ran)  #到这一步都没有问题,x_ran确实是打乱后的下三角数据
  x1[lower.tri(x)] <- x_ran; x1 <- x1 + t(x1)  #运行完这一步后,数据就跟原数据不一样了,不知道为什么
刚又试了下,不是数据不一样了,而是报错 Error in x1 + t(x1) : non-conformable arrays
麻烦您抽空给看看好吗,谢谢你!
network.xls (27.5 KB)


地板
megapanda 发表于 2020-5-25 13:17:46
dark293 发表于 2020-5-25 11:32
你好,我确实是用的自己的矩阵数据哈。
  x
  1. x = as.matrix(read_xls('network.xls'))
  2. x1 = matrix(numeric(144), nrow = 12)
  3. x_ran = x[lower.tri(x)]
  4. x_ran <- sample(x_ran)
  5. x1[lower.tri(x)] <- x_ran; x1 <- x1 + t(x1)
  6. x1
复制代码
试下吧,其中read_xls函数在包readxl里
例子本身只是提供思路,不是说直接照搬啊你的数据是12x12的,我给的例子是5x5的矩阵

7
dark293 发表于 2020-5-25 14:00:32
megapanda 发表于 2020-5-25 13:17
试下吧,其中read_xls函数在包readxl里
例子本身只是提供思路,不是说直接照搬啊你的数据是12x12 ...
这下明白了,我少了一步x1 = matrix(numeric(144), nrow = 12)。

谢谢你,真是帮了大忙了。抱歉,我R语言基础不好,耽误你时间了哈。再次感谢你的帮助!

8
dark293 发表于 2022-1-7 15:32:48
megapanda 发表于 2020-5-25 00:56
既然是对称矩阵,你只需要打乱上三角或下三角的数据,另外一半直接按对称赋值就行了
给你一个参考
您的这个方法,是将上三角(或下三角)的数据全部混在一起打乱的。请问是否有办法,可以在每列(或行)数值保持不变的情况下打乱呢?即第一列只是将1234打乱,第二列只是打乱567呢?真心求教,谢谢谢谢!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-4 23:03