Rのパーセンタイルランクの計算[終了]


18

変数の1つのパーセンタイルランクとなる新しい変数をデータフレームに追加するにはどうすればよいですか?これはExcelで簡単に実行できますが、実際にはRで実行したいです。

ありがとう

回答:


27

生データ値のベクトルが与えられると、単純な関数は次のようになります

perc.rank <- function(x, xo)  length(x[x <= xo])/length(x)*100

ここx0で、R-bloggersでx提案されているように、vectorが与えられた場合のパーセンタイルランクが必要な値です。

ただし、次のように簡単にベクトル化できます。

perc.rank <- function(x) trunc(rank(x))/length(x)

各値を渡す必要がないという利点があります。そのため、使用例を次に示します。

my.df <- data.frame(x=rnorm(200))
my.df <- within(my.df, xr <- perc.rank(x))

3
1.あなたの関数はExcelのpercentrank-functionを模倣していません。これは良い(+1 )です。後者は "奇妙な"結果を与えるからです(私の比較をご覧ください)。2. R関数(F分布の密度、を参照)dfであるため、データフレームに名前を付けません。df?df
ベルントヴァイス

1
@Berndありがとう。(1)さまざまな心理測定パッケージでPRを計算するための組み込み関数がいくつかあります。私CTTは少し前にパッケージからこれを入手したと思います。持っていない/使用していないため、Excelをチェックしませんでした。(2)について私はこれをいつも忘れているようです!my.*(Perl way)で行こう:-)
chl

@chlなぜtrunc必要なのですか?とにかく、ランクは常に整数を返すようです。
タイラーリンカー

1
@タイラー・ノープ。同順位の場合、rank()デフォルトでは同順位の値の平均を取得します(を参照ties.method = c("average",...))。
chl

8

元のdata.frameが呼び出されdfr、目的の変数が呼び出されるmyvar場合dfr$myrank<-rank(dfr$myvar)、通常のランクまたはdfr$myrank<-rank(dfr$myvar)/length(myvar)パーセンタイルランクに使用できます。

しかたがない。あなたが本当にExcelの方法が必要な場合(最も簡単な解決策ではないかもしれませんが、新しい(私にとって)関数を使用してループを回避するいくつかの楽しみがありました):

percentilerank<-function(x){
  rx<-rle(sort(x))
  smaller<-cumsum(c(0, rx$lengths))[seq(length(rx$lengths))]
  larger<-rev(cumsum(c(0, rev(rx$lengths))))[-1]
  rxpr<-smaller/(smaller+larger)
  rxpr[match(x, rx$values)]
}

だから今、あなたは使用することができます dfr$myrank<-percentilerank(dfr$myvar)

HTH。


1-(ランク/サイズ)は、excel percentilerank
user333

私はからこれを得たoffice.microsoft.com
ニックSabbe

匿名の(試行された)エディターが次のコメントを追加しようとしましたlength < length(dfr$myvar)
グン-モニカの復職

1

提示された回答の問題は、NAがある場合、適切に機能しないことです。

この場合、別の可能性(chl♦の機能に触発された)は次のとおりです。

perc.rank <- function(x) trunc(rank(x,na.last = NA))/sum(!is.na(x))
quant <- function (x, p.ile) {
      x[which.min(x = abs(perc.rank(x-(p.ile/100))))]
}

ここで、xは値のベクトルであり、p.ileはランクごとのパーセンタイルです。(任意の)coef.matのランクによる2.5パーセンタイルは、次のように計算できます。

quant(coef.mat[,3], 2.5)  
[1] 0.00025  

または単一の機能として:

quant <- function (x, p.ile) {
   perc.rank <- trunc(rank(x,na.last = NA))/sum(!is.na(x))
   x = na.omit(x)
   x[which.min(x = abs(perc.rank(x-(p.ile/100))))]
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.