使用每个第二个i(i = 1、3、5,...)在列中交换每一行i和i + 1的顺序。

3

我有

d <- matrix(rnorm(6), ncol = 1, 
            dimnames = list(c("a", "a1", "d", "e", "f", "f2"), NULL))

我希望按照以下顺序对行进行排序:a1,a,e,d,f2,f
注意事项:
  • 我正在寻找一般解决方案。当然,我知道如何针对此特定矩阵进行操作。
  • 行名称可以是各种名称,因此任何与字符串相关的操作都不起作用。
  • 矩阵d的条目不会超过16-20个。所以不用担心速度问题。
  • 该矩阵始终具有偶数行。

d[1:nrow(d) + c(1, -1), , drop = FALSE] - Henrik
2个回答

3
我们可以使用一个逻辑向量来筛选行名称,将名称首先通过rbind连接到一个matrix中,使用c移除dim属性(转换为一个vector),并将其作为行索引。
d[c( rbind(row.names(d)[c(FALSE, TRUE)], 
   row.names(d)[c(TRUE, FALSE)])),, drop = FALSE]
#          [,1]
#a1 -0.43704092
#a   0.41215035
#e   1.47443155
#d  -1.78087570
#f2 -0.01673482
#f   0.98952497

2

将每对行交换后,我们得到了行号为2、1、4、3、6、5等。因此,在转换后,第n行是原矩阵中第(n-(-1)^n)行。

因此,您想要的行顺序是1:nrow(d) - (-1)^(1:nrow(d))

d[1:nrow(d) - (-1)^(1:nrow(d)), , drop = FALSE]
#          [,1]
# a1  0.1228430
# a  -1.4051684
# e  -0.7928203
# d   1.3270429
# f2  0.3554126
# f  -1.1388026

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接