2015-06-03 80 views
5

我需要的只是交换这个表中的每两行......基本上将包含'chao1'的每一行与下一行交换,当然这包含'obs'。重新排序data.frame中的行吗?

我所有过关的例子似乎都有此前的参考资料,但我认为,我认为它有点不同。

 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 

在此先感谢您的帮助!

干杯,

安德烈

+0

第三行的'Cliona virids'是否是一个错字? –

+0

@DavidArenburg,它是! - > viridis –

+0

那么你有没有试过我的解决方案?应该非常快。 –

回答

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] 
+0

哦......我喜欢这个。 –

+0

尽管我的线条使用较少,但是您利用了代数与几何之间的相互作用。 –

+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 
3

这里有些作品使用了David几个小时前教给我的诀窍:)。它也需要偶数行,并且它们被正确地排序。

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