重新排序data.frame中的行?

时间:2015-06-03 21:38:28

标签: r

我需要的是交换此表中的每两行...基本上将包含'chao1'的每一行与下一行交换,其中包含'obs'。

我所遇到的所有例子似乎都有一个先前的参考,但我认为,我想要的是有点不同。

     Group.1                  var     S           se    
1    Cliona celata complex    chao1   800.5933    57.51779
2    Cliona celata complex    obs     495.4286    63.07360
3    Cliona viridis           chao1   432.5548    35.87778
4    Cliona viridis           obs     286.0000    55.32179
5    Dysidea fragilis         chao1   694.9129    74.85536
6    Dysidea fragilis         obs     357.6667    64.02170
7    Phorbas fictitius        chao1   851.6950    57.67145
8    Phorbas fictitius        obs     523.2500    23.57905

提前感谢您的帮助!

干杯,

安德烈

3 个答案:

答案 0 :(得分:4)

快速执行此操作的方法是使用data.table devel版本setorder,它会对您的数据集进行重新排序

#### To install development version
## library(devtools)
## install_github("Rdatatable/data.table", build_vignettes = FALSE)

library(data.table) # V >= 1.9.5
setorder(df, Group.1, -var)
#                 Group.1   var        S       se
# 2 Cliona celata complex   obs 495.4286 63.07360
# 1 Cliona celata complex chao1 800.5933 57.51779
# 4        Cliona viridis   obs 286.0000 55.32179
# 3        Cliona viridis chao1 432.5548 35.87778
# 6      Dysidea fragilis   obs 357.6667 64.02170
# 5      Dysidea fragilis chao1 694.9129 74.85536
# 8     Phorbas fictitius   obs 523.2500 23.57905
# 7     Phorbas fictitius chao1 851.6950 57.67145

答案 1 :(得分:3)

这是使用大卫几个小时前教给我的技巧的方法。它还需要偶数行,并且可以正确排序。

 df <- data.frame(g1=c("a","a","b","b"),var=c(1,2,3,4))
 df
 #   g1 var
 # 1  a   1
 # 2  a   2
 # 3  b   3
 # 4  b   4

 n <- nrow(df)
 sidx <- trunc(seq(0,n-1)/2)*2 + rep(c(1,0),n/2) + 1
 df <- df[sidx,]
 df

 #   g1 var
 # 2  a   2
 # 1  a   1
 # 4  b   4
 # 3  b   3

答案 2 :(得分:2)

假设您的数据框具有偶数行,您可以执行此操作:

n <- nrow(df)
x <- matrix(1:n, ncol=2, byrow=TRUE)
y <- x[,2:1]
inds <- as.numeric(t(y))
new.df <- df[inds,,drop=FALSE]