2015-06-03 30 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