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

Заранее благодарю за помощь!

Cheers,

Андре

+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

Oooh ... Мне это нравится. –

+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

Вот что-то, что работает, используя трюк, который Дэвид научил меня всего несколько часов назад :). Для этого также требуется четное количество строк, и они упорядочиваются должным образом.

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 
Смежные вопросы