交换行,每两行

Swap rows, per two rows

是否可以将相邻的两行相互交换,然后移动到下两行,并将它们各自的行交换在一起?即,将第 1 行中的 col1 值与第 2 行中的 col 1 值交换;将第 87 行中的 col 1700 值与第 88 行中的 col 1700 值交换。

示例数据:

     col1  col2
row1 a      b
row2 b      b
row3 c      a
row4 d      c

我的真实数据有很多行和列,每次循环时数据都会改变,所以我需要一种不引用特定列名和行名的方法。

所需的结果如下所示:

    col1  col2
row1 b      b
row2 a      b
row3 d      c
row4 c      a

2人一组第一行加1,2人一组第二行减1:

dat[seq_len(nrow(dat)) + c(1,-1),]
#     col1 col2
#row2    b    b
#row1    a    b
#row4    d    c
#row3    c    a

之所以可行,是因为 R 中的向量回收:

1:10 + c(1,-1)
#[1]  2  1  4  3  6  5  8  7 10  9

另一种方法是创建两个序列,一个用于奇数,一个用于偶数,然后将它们交替组合,然后将它们用作行索引。

df[c(rbind(seq(2, nrow(df), 2), seq(1, nrow(df), 2))),]

#     col1 col2
#row2    b    b
#row1    a    b
#row4    d    c
#row3    c    a

其中

seq(2, nrow(df), 2)
#[1] 2 4

生成偶数序列并且

seq(1, nrow(df), 2)
#[1] 1 3

生成奇数序列。

然后我们使用 rbindc 从两个向量中交替 select 索引。