2015-06-03 13 views
5

Tất cả những gì tôi cần là trao đổi hai hàng trong bảng này ... Về cơ bản, trao đổi mọi hàng có chứa 'chao1' với hàng kế tiếp, chắc chắn chứa 'obs'.Sắp xếp lại các hàng trong một data.frame?

Tất cả các ví dụ tôi đã đi qua dường như có một tham chiếu trước đó cho điều đó, nhưng những gì tôi đang tìm kiếm, tôi nghĩ, là một chút khác nhau.

 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 

Cảm ơn bạn trước sự giúp đỡ!

Chúc mừng,

André

+0

Có phải 'Cliona virids' ở hàng thứ ba là lỗi đánh máy không? –

+0

@DavidArenburg, đúng rồi! -> viridis –

+0

Vì vậy, bạn đã thử giải pháp của tôi chưa? Nên rất nhanh. –

Trả lời

2

Giả khung dữ liệu của bạn có một thậm chí số hàng bạn có thể làm điều này:

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

Oooh ... Tôi thích điều này. –

+0

Mặc dù tôi sử dụng ít đường hơn, bạn khai thác sự tương tác giữa đại số và hình học. –

+0

Cảm ơn rất nhiều, điều này đã làm việc hoàn hảo :) –

4

Một cách nhanh chóng để làm điều này là sử dụng data.table devel phiên bản setorder mà sẽ sắp xếp lại dữ liệu của bạn đặt ở vị trí quá

#### 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

Đây là một cái gì đó hoạt động bằng cách sử dụng một mẹo mà David đã dạy tôi chỉ một vài giờ trước :). Nó cũng đòi hỏi một số hàng thậm chí và chúng được đặt hàng đúng cách.

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 
Các vấn đề liên quan