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