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

orderコマンドを使用してみましたが、両方の列で並べ替える必要があります。誰かがそれを手伝ってくれませんか?

ありがとう!

4

3 に答える 3

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
于 2013-01-21T19:33:44.797 に答える
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
于 2013-01-21T19:07:08.627 に答える
2

@GregSnowを拡張して、2つ以上の列がある場合に拡張します(実際にそのように使用していることがわかります)。

vのグループに従って並べ替えa、保持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
于 2013-01-21T20:32:20.693 に答える