2016-04-12 23 views
1

İşte benim örnek dataframeR: Bir vektörün sırasına göre bir veri çerçevesini mi sıralıyorsunuz?

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) 

Ve ben çıktı şuna benzer şekilde, belirli bir vektör (desiredOrder) belirtilen sıraya göre sıralamak istiyorum:

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 

(böylece

: id = 456 denedim

id = 123, ancak satır orijinal sipariş korunur satırların) yukarıdaki yukarı taşındı satırlar Sonuç Peşinde olduğum şey oldukça uzağında Ancak

: o zaman

 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 

cevap

3

Biz vector yılında unique elemanlar olarak belirlenen levels ile factor için 'kimliği' sütunu dönüştürebilir ve order

yapmak
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

azalan düzen ... ama gerçek hayatta kimlik artan sırada değil. Vektörde belirtilen sıraya göre ID sütununun sırasına ihtiyacım var (requiredOrder). Maalesef soru çok net değil Şimdi düzelteceğim – HollowBastion

+0

@HollowBastion Yayını güncellendi. – akrun

2

Ayrıca yapabilirsiniz:

library(dplyr) 

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

Benzer şekilde taban R - 'birleştirme (liste (id = benzersiz (requiredOrder)), df, sort = FALSE) – thelatemail

0

Ayrıca) (dplyr kütüphanenin fonksiyonlarını (düzenlemek) ve desc kullanabilirsiniz:

Ben küçükten büyüğe id sütunu koyduk ve çözüm içinde kimliği sütunu vardır Sadece kolay bir örnek uğruna
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 
İlgili konular