2015-01-21 95 views
3

我有以下數據框:排序數據幀中的R

v2 <- c(4.5, 2.5, 3.5, 5.5, 7.5, 6.5, 2.5, 1.5, 3.5) 
v1 <- c(2.2, 3.2, 1.2, 4.2, 2.2, 3.2, 2.2, 1.2, 5.2) 
lvl <- c("a","a","b","b","b","b","c","c","c") 
d <- data.frame(v1,v2,lvl) 
d 

    v1 v2 lvl 
1 2.2 4.5 a 
2 3.2 2.5 a 
3 1.2 3.5 b 
4 4.2 5.5 b 
5 2.2 7.5 b 
6 3.2 6.5 b 
7 2.2 2.5 c 
8 1.2 1.5 c 
9 5.2 3.5 c 

我想要做的是排序依據lvl分組大小的數據幀。 得到以下結果:

v1 v2 lvl 
2.2 4.5 a 
3.2 2.5 a 
2.2 2.5 c 
1.2 1.5 c 
5.2 3.5 c 
1.2 3.5 b 
4.2 5.5 b 
2.2 7.5 b 
3.2 6.5 b 

因爲,a具有長度爲2,c長度爲3,b長度4.

那怎麼可以實現?

回答

4
d$lvl <- factor(d$lvl, levels = names(sort(table(d$lvl)))) 
d[order(d$lvl),] 
    v1 v2 lvl 
1 2.2 4.5 a 
2 3.2 2.5 a 
7 2.2 2.5 c 
8 1.2 1.5 c 
9 5.2 3.5 c 
3 1.2 3.5 b 
4 4.2 5.5 b 
5 2.2 7.5 b 
6 3.2 6.5 b 
3

使用ave

d[order(ave(seq(d$lvl),d$lvl,FUN=length)),] 

# v1 v2 lvl 
#1 2.2 4.5 a 
#2 3.2 2.5 a 
#7 2.2 2.5 c 
#8 1.2 1.5 c 
#9 5.2 3.5 c 
#3 1.2 3.5 b 
#4 4.2 5.5 b 
#5 2.2 7.5 b 
#6 3.2 6.5 b 

這通過ave分配整個d$lvl組的長度對每個d$lvl值。 seq只是生成一個佔位符數值變量,其中ave可以保證沒有錯誤。

ave(seq(d$lvl),d$lvl,FUN=length) 
#[1] 2 2 4 4 4 4 3 3 3 
order(ave(seq(d$lvl),d$lvl,FUN=length)) 
#[1] 1 2 7 8 9 3 4 5 6 
# a a c c c b b b b