2016-04-12 4 views
1

Вот мой пример dataframeR: Сортировка кадра данных на основе порядка вектора?

df <- data.frame(id=rep(c(123,456),each=5),col1=c(3,6,4,3,8,9,2,1,3,4),col2=c(7,8,5,4,6,8,7,5,8,3)) 

    id col1 col2 
1 123 3 7 
2 123 6 8 
3 123 4 5 
4 123 3 4 
5 123 8 6 
6 456 9 8 
7 456 2 7 
8 456 1 5 
9 456 3 8 
10 456 4 3 

desiredOrder <- rep(c(456,123),each=5) 

И я хочу, чтобы отсортировать в соответствии с порядком, указанным в определенном векторе (desiredOrder), так что результат выглядит следующим образом:

id col1 col2 
1 456 9 8 
2 456 2 7 
3 456 1 5 
4 456 3 8 
5 456 4 3 
6 123 3 7 
7 123 6 8 
8 123 4 5 
9 123 3 4 
10 123 8 6 

(так строки, в которых идентификатор = 456 получили поднялся выше строк, где идентификатор = 123, но исходный порядок строк сохранились)

Я пробовал:

df[match(df$id,desiredOrder),] 

Однако результат весьма далек от того, что я после:

 id col1 col2 
6 456 9 8 
6.1 456 9 8 
6.2 456 9 8 
6.3 456 9 8 
6.4 456 9 8 
1 123 3 7 
1.1 123 3 7 
1.2 123 3 7 
1.3 123 3 7 
1.4 123 3 7 

ответ

3

Мы можем преобразовать столбец «ID» в factor с levels, указанных в качестве unique элементов в vector, а затем сделать order

df[order(factor(df$id, levels=unique(desiredOrder))),] 
# id col1 col2 
#6 456 9 8 
#7 456 2 7 
#8 456 1 5 
#9 456 3 8 
#10 456 4 3 
#1 123 3 7 
#2 123 6 8 
#3 123 4 5 
#4 123 3 4 
#5 123 8 6 
+0

Просто ради простого примера я поместил столбец ID в порядке возрастания и решение имеет столбец ID в по убыванию ... но в реальной жизни идентификатор не в порядке возрастания. Мне нужен порядок столбца идентификатора, который должен быть указан в векторе (желаемый ордер). Извините, вопрос не очень ясен. Я исправлю его сейчас. – HollowBastion

+0

@HollowBastion Обновлено сообщение. – akrun

2

Вы также можете сделать это:

library(dplyr) 

data_frame(id = desiredOrder) %>% 
    distinct %>% 
    left_join(df) 
+0

Аналогично в базе R - 'merge (список (id = unique (wishOrder)), df, sort = FALSE)' – thelatemail

0

Вы также можете использовать организовать() и убывание() функцию dplyr библиотеки:

library(dplyr) 
arrange(df, desc(id)) 

    id col1 col2 
1 456 9 8 
2 456 2 7 
3 456 1 5 
4 456 3 8 
5 456 4 3 
6 123 3 7 
7 123 6 8 
8 123 4 5 
9 123 3 4 
10 123 8 6 
Смежные вопросы