2013-01-21 33 views
1

我有這樣一個數據幀:數據幀保持一列內排序固定

a v 
1 g 9 
2 g 2 
3 z 2 
4 z 3 
5 a 5 
6 a 4 

我想保持列「A」完整[未分類的,因爲它是]和排序列「V」內列'a'。生成的輸出應該是這樣的:

a v 
1 g 2 
2 g 9 
3 z 2 
4 z 3 
5 a 4 
6 a 5 

我試過使用命令命令,但後來我必須按兩列排序。有人可以幫我嗎?

謝謝!

+0

保證是連續的'了'獨特的水平,在你的榜樣? –

+0

是的,他們是連續的 – user1998031

回答

10

下面是使用ave功能的方法:

> dat$v <- ave(dat$v, dat$a, FUN=sort) 
> dat 
    a v 
1 g 2 
2 g 9 
3 z 2 
4 z 3 
5 a 4 
6 a 5 
7

data.table封裝使這個簡單的:

library(data.table) 

dat <- structure(list(a = c("g", "g", "z", "z", "a", "a"), v = c(9L, 
2L, 2L, 3L, 5L, 4L)), .Names = c("a", "v"), row.names = c(NA, 
-6L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x1b2cba8>) 

dat[, list(v=sort(v)), by=a] 

# a v 
# 1: g 2 
# 2: g 9 
# 3: z 2 
# 4: z 3 
# 5: a 4 
# 6: a 5 
+0

謝謝它的作品!你能修改代碼,以便排序後的列具有與之前相同的列名稱,即'v' – user1998031

+0

@MthetheLundberg啊,我猜你不能!下面的'ave'答案可能是基R的最佳方式。@ user1998031請參閱我的使用'list()'編輯。 – Justin

2

擴展在@GregSnow於以下情況:有超過兩列多(因爲我可以看到實際上使用它)。根據a

排序v,保持x

d <- read.table(header=TRUE, text=" a v x 
1 g 9 10 
2 g 2 20 
3 z 2 30 
4 z 3 40 
5 a 5 60 
6 a 4 70") 

ord <- ave(seq_along(d$a)-1, d$a, FUN=min) + ave(d$v, d$a, FUN=order) 

d[ord,] 
## a v x 
## 2 g 2 20 
## 1 g 9 10 
## 3 z 2 30 
## 4 z 3 40 
## 6 a 4 70 
## 5 a 5 60