每两行交换一行

时间:2018-03-08 03:34:04

标签: r swap

是否可以互相交换两个相邻的行,然后移动到接下来的两行,并将它们各自的行交换在一起?即,第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 个答案:

答案 0 :(得分:7)

在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

答案 1 :(得分:3)

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

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来从两个向量中选择索引。