1

次のような data.frame があります。

 Name1    Name2    Name3   
   1        1         1    
  -1       -1         1
   1       -1         1   
   1       -1         1     
  -1       -1         1    

次のように、各列に対して一種のランクサムテストを実行したいと思います。

各列の最初の要素から始めて(つまり、私のdata.frameの各リストについて)、2番目の要素が最初の要素と等しい場合(例:1と1の場合)、それらが等しいためスコアが1単位増加します。スコアは 1 単位減ります (例: 1 と -1 の場合、それらは等しくないため)。

例: 列 "Name1"
最初の要素 = 1 : スコア = 1 (開始位置)
2 番目の要素 = -1: スコア = 0 (1 != -1 であるため、前のスコア (1) から 1 単位が削除されます)
3 番目の要素 = 1 : スコア = 1 (スコアを 1 に初期化しています。初期化するたびに、スコアは +1 になります)。
4 番目の要素 = 1 : スコア = 2 (3 番目と 4 番目の要素が等しいため、以前のスコア 1 プラス 1 単位)
5 番目の要素 = -1: スコア = 1 (4 番目の要素 != 5 番目の要素であるため、以前のスコア 2 - 1 単位)。

column "Name2"
最初の要素 = 1 : スコア = 1 (開始位置)
2 番目の要素 = -1: スコア = 0 (1 != -1 であるため、前のスコア (1) から 1 単位が削除されます)
3 番目の要素 = -1:スコア = 1 (スコアを再初期化しています)
4 番目の要素 = -1: スコア = 2 (3 番目の要素は 4 番目の要素と等しいため、前のスコアは 1 単位増加します)
5 番目の要素 = -1: スコア = 3 (4 番目の要素は 5 番目に等しいので、前のスコア、つまり 2 は 1 単位増加します)

したがって、ランキングの要素が前の要素と等しいか異なる場合、カウンターは数値 == 1 のスコアを増減し、0 になるたびに 1 に初期化されます。

最終的な目標は、ランダムな要素に対して、ランク内の等しい要素と連続した要素により高いスコアを与えることです。

誰でも私を助けてもらえますか?

4

5 に答える 5

2

私があなたを正しく理解していれば...

d <- read.table(text="Name1    Name2    Name3   
   1        1         1    
  -1       -1         1
   1       -1         1   
   1       -1         1     
  -1       -1         1", header=TRUE)


f1 <- function(score, pair) {
    if (score == 0) pair[1]
    else if (as.logical(diff(pair))) score - 1
    else score + 1
}

f2 <- function(col) {
    lagged <- embed(col, 2)
    Reduce(f1, split(lagged, seq(nrow(lagged))), init=1)
}

lapply(d, f2)
# $Name1
# [1] 1
# 
# $Name2
# [1] -1
# 
# $Name3
# [1] 5
于 2013-06-11T19:47:10.310 に答える
1

これはあなたのその後の質問に対する回答であり、Matthew Plourde が回答したと思われる最初の質問ではありません。

必要なランクの尺度を取得するには、たとえば、同じ数が連続して複数回ある列の断片の長さの合計を数えることができます。たとえば、以下の例では、3 と 2 を加算してランク 5 を取得できます。

x = c(1,-1,1,1,1,-1,-1)
rle(x)
#Run Length Encoding
#  lengths: int [1:4] 1 1 3 2
#  values : num [1:4] 1 -1 1 -1

関数に入れるには:

rank = function(x) {
  x.rle = rle(x)
  sum(x.rle$lengths[x.rle$lengths > 1])
}

sapply(OP_dat, rank)
#Name1 Name2 Name3 
#    2     4     5 
于 2013-06-11T20:02:30.033 に答える
0

この関数を考えてみましょう:

f <- function(x)
{
  2 * sum(tail(x, -1)==head(x, -1)) - length(x) + 1
}

提案されたスコアは、前の要素と等しい要素の数から異なる要素の数を引いたものとして計算されます。この最後の数字は最初の数字を補完するため、関数は上記の簡略化された形式で記述できます。

これをデータフレームのすべての列に適用する場合は、次を使用しますsapply

dat <- read.table(header=TRUE, text="
 Name1    Name2    Name3   
   1        1         1    
  -1       -1         1
   1       -1         1   
   1       -1         1     
  -1       -1         1
")
sapply(dat, f)
# Name1 Name2 Name3 
#    -2     2     4 
于 2013-06-11T19:30:06.007 に答える