R:循环矩阵对特定行单独排序列

Posted

技术标签:

【中文标题】R:循环矩阵对特定行单独排序列【英文标题】:R: loop matrix sort columns individually for specific rows 【发布时间】:2017-04-16 03:30:56 【问题描述】:

我想对具有相同名称的行按列对矩阵 (U) 进行排序。我的(非常大的)矩阵看起来与此类似:

  1  2 
1 5  6
1 -4 4
1 6 -2
2 7 -2
2 -2 3

现在我想遍历矩阵寻找相同的行,然后对具有相同 row.name 的列进行排序,从而得到这个矩阵:

   1   2 
1 -4   -2
1  5   4
1  6   6
2  -2  -2
2  7   3

到目前为止,我的代码如下所示:

第一步是行数,它有效:

z <- 1 
for(i in (1:nrow(U)))
 if(row.names(U)[i] != row.names(U)[i-1])
 z = (sum(row.names(U) == row.names(U)[i]))+1

现在我想在行计数之后添加一个排序函数,我手动尝试了第一组行:

x <- 1
for(x in (1:ncol(U)))
  U[1:3,x]<- U[do.call(order, lapply(x:NCOL(U), function(x) U[1:3, x]

然而,这个循环一方面非常慢,另一方面它只能正确填充第一列

您有什么建议可以在考虑性能问题的同时改进排序功能吗?

编辑:我想这在我的第一次编辑中令人困惑。我的矩阵的第一个“列”是 row.names,在这个例子中我有一个 5x2 矩阵

【问题讨论】:

【参考方案1】:

这是一种方法,它首先按行名使用 order(),然后依次按每一列。这就是你所追求的吗?

U <- matrix(c(5,6,-4,4,6,-2,7,-2,-2,3), byrow=TRUE, ncol=2, dimnames=list(c(1,1,1,2,2), c(1,2)))

apply(U, 2, function(j) j[order(rownames(U), j)])

【讨论】:

您的应用功能完全符合我的要求。谢谢你:)【参考方案2】:

我们可以使用data.table,转换为data.table,按第一列('U')分组,遍历列和sort

library(data.table)
as.data.table(m1)[, lapply(.SD, sort), by = U]

【讨论】:

我想,我明白了你的意思,现在我认为它有效:as.data.table(U)[, lapply(.SD, sort), by = list(row.names(U)) ] @Max 我认为'U'是你的第一列而不是行名【参考方案3】:

使用dplyr的替代方法

df = read.table(textConnection("U 1  2 
1 5  6
1 -4 4
1 6 -2
2 7 -2
2 -2 3"), header= TRUE)

library(dplyr)
df %>% group_by(U) %>% transmute(sort(X1),sort(X2))

【讨论】:

以上是关于R:循环矩阵对特定行单独排序列的主要内容,如果未能解决你的问题,请参考以下文章

利用matlab对矩阵的特定位置赋值?

R中的性能:对矩阵中的行元素进行排序的最快方法是啥?

对 data.frame 或矩阵中的行求和

对矩阵按行和按列进行排序

R语言使用cor函数计算相关性矩阵进行相关性分析,使用corrgram包可视化相关性矩阵行和列使用主成分分析重新排序下三角形中使用底纹和颜色表示相关性变量按其原始顺序绘制上三角形空白

R语言使用cor函数计算相关性矩阵进行相关性分析,使用corrgram包可视化相关性矩阵行和列使用主成分分析重新排序下三角形中使用底纹和颜色表示相关性(自定义颜色)上三角形中添加相关性数值