R:针对特定行

时间:2016-12-01 13:13:04

标签: r sorting matrix

我想为具有相同名称的行按列(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]

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

您是否有建议我如何改进排序功能,同时考虑性能问题?

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

3 个答案:

答案 0 :(得分:0)

我们可以使用data.table,转换为data.table,按第一列(&#39; U&#39;)分组,循环显示列和sort

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

答案 1 :(得分:0)

使用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))

答案 2 :(得分:0)

这是一种方法,它首先按行名称使用order(),然后依次按每列使用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)])