1

私には理解できない質問がありますが、これにはrank. df整数値を持つ 3 つの変数を持つワイド フォームがあるとします。

id   var1   var2  var3
1    23     8     30
2    1      2     3
3    4      5     1
4    100    80    60

var1var2、およびvar3最大から最小の値のランクを持つ 3 つの新しい変数を作成したいと思います。例えば、

id   var1   var2  var3   var1_rank   var2_rank   var3_rank
1    23     8     30      2          3            1
2    1      2     3       3          2            1 
3    4      5     1       2          1            3
4    100    80    60      1          2            3       

どうすればこれを行うことができますか?ありがとう!

4

3 に答える 3

3

formatで作業する方が簡単だと思います(そして、 a に強制するためlong、メモリ効率が向上します。ここでは、とを使用したアプローチがありますapplymatrixreshapedata.table

library(data.table)
tlong <- reshape(data.table(test), direction ='long', varying = list(2:4), 
                 times = paste0('var',1:3), v.names = 'value')

# calculate the rank within each `id`

tlong[, rank := rank(-value), by = id]
tlong

##     id time value rank
##  1:  1 var1    23    2
##  2:  2 var1     1    3
##  3:  3 var1     4    2
##  4:  4 var1   100    1
##  5:  1 var2     8    3
##  6:  2 var2     2    2
##  7:  3 var2     5    1
##  8:  4 var2    80    2
##  9:  1 var3    30    1
## 10:  2 var3     3    1
## 11:  3 var3     1    3
## 12:  4 var3    60    3

# reshape to wide (if you want)

oldname <- paste0('var1',1:3)

twide <- reshape(tlong, direction = 'wide', timevar = 'time', idvar = 'id')
# reorder from value.var1, rank.var1,... to value.var1, value.var2,....rank.var1, rank.var2

setcolorder(twide, c('id', paste('value', oldname, sep ='.'), paste('rank', oldname, sep = '.'))
于 2013-04-12T03:38:36.233 に答える
3

サンプル データを取得します。

test <- read.table(text="id   var1   var2  var3
1    23     8     30
2    1      2     3
3    4      5     1
4    100    80    60",header=TRUE)

ランク部分を取得し、適切に名前を変更します (ランクを逆にすることに注意してください。これにより、サイズを増やすのではなく減らすことに関連します。これは、入力として使用される-xの任意のサイズに一般化できます)。data.frame

ranks <- t(apply(test[,-1], 1, function(x) rank(-x) ))
colnames(ranks) <- paste(colnames(ranks), "_rank", sep="")

古いデータ フレームと結合します。

data.frame(test, ranks)

結果:

> data.frame(test,ranks)
  id var1 var2 var3 var1_rank var2_rank var3_rank
1  1   23    8   30         2         3         1
2  2    1    2    3         3         2         1
3  3    4    5    1         2         1         3
4  4  100   80   60         1         2         3

ベースRを使用して@mnelの答えにたどり着くには、次のようなこともできます。

testres <- data.frame(test["id"],stack(test[2:4]))
testres$rank <- ave(testres$values,testres$id,FUN=function(x) rank(-x) )

> testres
   id values  ind rank
1   1     23 var1    2
2   2      1 var1    3
3   3      4 var1    2
4   4    100 var1    1
5   1      8 var2    3
6   2      2 var2    2
7   3      5 var2    1
8   4     80 var2    2
9   1     30 var3    1
10  2      3 var3    1
11  3      1 var3    3
12  4     60 var3    3
于 2013-04-12T03:12:37.140 に答える
2

1 つのアプローチを次に示します。

data.frame(dat, 4 - t(apply(dat[, -1], 1, rank)))

## > data.frame(dat, 4 - t(apply(dat[, -1], 1, rank)))
##   id var1 var2 var3 var1.1 var2.1 var3.1
## 1  1   23    8   30      2      3      1
## 2  2    1    2    3      3      2      1
## 3  3    4    5    1      2      1      3
## 4  4  100   80   60      1      2      3
于 2013-04-12T03:05:26.170 に答える