楼主: 子衿1219
2181 9

[问答] R矩阵排序 [推广有奖]

  • 1关注
  • 4粉丝

讲师

70%

还不是VIP/贵宾

-

威望
0
论坛币
60 个
通用积分
1.0023
学术水平
2 点
热心指数
0 点
信用等级
1 点
经验
13521 点
帖子
326
精华
0
在线时间
431 小时
注册时间
2012-3-19
最后登录
2018-7-8

楼主
子衿1219 发表于 2017-8-31 14:55:46 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
例如我有个矩阵A
A=(1,3,
      2,3,
      4, 5)

现在打乱A的行的顺序
B=(2,3
      4, 5,
      1, 3)
如何找出B的矩阵的每一行在原来A矩阵的顺序,结果应该是(2,3,1)即原来的第一行在A矩阵中是第2行所以第一个元素是2,依次类推。
二维码

扫码加我 拉你入群

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

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

关键词:r矩阵

回帖推荐

cheetahfly 发表于4楼  查看完整内容

问题出在identical()太严格了

沙发
cheetahfly 在职认证  发表于 2017-8-31 16:23:24
  1. apply(apply(B, 1, function(y) {apply(A, 1, function(x) identical(x, y))}), 2, which)
复制代码

藤椅
子衿1219 发表于 2017-8-31 17:09:42
cheetahfly 发表于 2017-8-31 16:23
谢谢,亲测之后,举了一个特殊的例子,觉得不行呢。比方说,
a <- matrix(c(1:16),4,4)
A <- which(upper.tri(a),arr.ind = TRUE)
b <- c(10,5,9, 13, 14,15)
G1 <- b %% ncol(a)
G2 <- floor(b / ncol(a)) + 1
B <- interactionOrder <- cbind(G1,G2)

colnames(A) <- NULL
colnames(B) <- NULL

apply(apply(B, 1, function(y) {apply(A, 1, function(x) identical(x, y))}), 2, which)
会报错。

板凳
cheetahfly 在职认证  发表于 2017-8-31 17:42:53
子衿1219 发表于 2017-8-31 17:09
谢谢,亲测之后,举了一个特殊的例子,觉得不行呢。比方说,
a
问题出在identical()太严格了
  1. apply(apply(B, 1, function(y) {apply(A, 1, function(x) all(dplyr::near(x, y)))}), 2, which)
复制代码

报纸
子衿1219 发表于 2017-8-31 17:49:21
cheetahfly 发表于 2017-8-31 17:42
问题出在identical()太严格了
非常感谢。可以了~~~

地板
子衿1219 发表于 2017-8-31 18:07:05
cheetahfly 发表于 2017-8-31 17:42
问题出在identical()太严格了
刚又把这个程序用在大矩阵中比方说,5000*2,还是会显示跟刚才一样的报错。。

7
子衿1219 发表于 2017-8-31 20:10:17
apply(B, 1, function(x){which.max(!colSums(t(A) != x))})可以解决。

8
cheetahfly 在职认证  发表于 2017-8-31 20:54:16

我的方法中用了三重循环,不适合大矩阵,慢的要死,你的方法快多了!
如果针对这种“瘦长”型的大矩阵,我会转向用data.frame+left_join的思路:
  1. library(dplyr)
  2. tbl_df(B) %>%
  3.   left_join(mutate(tbl_df(A), order = row_number()), by = names(.)) %>%
  4.   pull(order)
复制代码
这样做的好处是,大矩阵中,如果有重复或出错的行,都不影响运行。过后检验结果便知。

9
子衿1219 发表于 2017-9-3 18:45:23
cheetahfly 发表于 2017-8-31 20:54
我的方法中用了三重循环,不适合大矩阵,慢的要死,你的方法快多了!
如果针对这种“瘦长”型的大 ...
非常感谢~~~

10
katymeala 发表于 2017-9-6 15:47:24
#先并起来
A <- apply(A,1,paste,sep="_")
B <- apply(B,1,paste,sep="_")
#再grep
result <- sapply(B, function(x) grep(x,A))

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

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