2013-06-11 46 views
1

我有data.frame,看起來像這樣:秩和分數計算

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

我想執行排序秩和檢驗的每個列,這樣即:

從每列的第一個元素開始(因此對於我的data.frame的每個列表) 如果第二個元素等於第一個元素(對於ex:1和1),分數將增加一個因爲他們是平等的,否則分數會減少一個單位(因爲他們是不平等的,例如:1和-1)。

例如:列 「NAME1」
第一個元素= 1:得分= 1(起始位置)
第二元件= -1:得分= 0(1個單位從先前分(1),因爲刪除了1個! = -1)
第三個元素= 1:分數= 1(您正在將分數初始化爲1.每次初始化時,分數爲+1)。
第四個元素= 1:得分= 2(因爲第三個和第四個元素相等,所以先前得分1加1個單位)
第五個元素= -1:得分= 1(先前得分2-1單位因爲第四個元素!第五元素)。 !

柱 「NAME2」
第一個元素= 1:得分= 1(起始位置)
第二元件= -1:得分= 0(1單位從先前分(1),因爲1 =除去 - 1)
第三個元素= -1:分數= 1(您正在重新初始化分數)
第四個元素= -1:分數= 2(第三個元素等於第四個,所以先前的分數將增加1個單位)
第五元件= -1:得分= 3(第四個要素是等於第五之一,所以以前的得分,因此如圖2所示,將1個單位增加)

因此計數器將增加或減少一個數== 1的得分,如果在排名的元件是由與前一個相同或不同的,它會在每次它進入時被初始化爲1,以0

最終目標是在等級和連續的等級中給予隨機分數更高的分數。

誰能幫助我嗎?

+0

你想獲得的結果是什麼?最後一個值?逐步值的順序?請給出一個關於某些數據結果的例子。 – DrDom

回答

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 
+1

我瞭解OP的方式輸出應該是'1,-1,5' – eddi

+0

傢伙嗨,我的觀點是有點不同,你的幫助並不完全適合我的問題。我的想法是在等級和連續的元素中給予較高的分數以便隨機的分數。可能我必須編輯我的問題。但無論如何非常感謝你! – Elb

+0

嗨Ferdinand.kraft!即使這個答案完全不符合我的問題,就像迪文的答案一樣,這個解決方案突出顯示了即使不是最好的方式,也是三列之間的區別。所以再次感謝你! – Elb

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 
+1

@Elb不符合你的描述,因爲當你-1名稱2,元素和下一個元素是相同的,所以你要根據自己的OP加1,並得到0 – eddi

+0

是啊,對不起,我是困惑。我刪除最後一個註釋馬修.. – Elb

0

添加一個到一個平等的測試,構建1的的指數和2的從C選擇(-1,1)

func <- function(x) 1+     # your "starting position" 
        sum(c(-1, 1)[1+ # convert from 0/1 to 1/2 
            (x[-1] == x[-length(x)]) ]) 

> sapply(dat, func) 
Name1 Name2 Name3 
    -2  2  4 
+1

如果這無法解釋的downvote是從OP,以獲得更好的答案的辦法就是讓你的問題更清晰。 –

+0

它來自我,與其他downvote相同的原因,而OP似乎對他們想要的東西感到困惑,這與OP描述不匹配。 – eddi

+1

OP對這個問題的規格是矛盾的(而且非常混亂)。我選擇實施第一個。你正在選擇第二個。 –

1

這是回答你的問題以後,而不是第一其中之一,我相信馬修普盧德已經回答了。

爲了得到你想要的排名的度量,你可以爲實例數列的有相同數量超過一排一次片的長度的總和。 E.g在下面你的例子中可以添加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 
+0

嗨eddi!非常感謝您的幫助,併爲錯誤感到抱歉。即使你與我提出的函數完全不符,但我認爲這是一個很好的答案,因爲在任何情況下,由於元素的原因,在名稱2方面相對於名稱1(隨機分佈的元素)的分值更高,而對於名稱3的分值更低1在Name2列中。所以這恰好符合我在工作中要強調的內容。萬分感謝!!!!! – Elb

0

也許這會有所幫助。

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

f <- function(x) { 
    tail(cumsum(x), 1) 
} 

sapply(dat, f) 

#Name1 Name2 Name3 
# 1 -3  5 

如果你要比較這些結果,您可能需要abs值。

+0

這種想法的問題是,像'C(1,1,1,1,-1,-1,-1,-1)'將比分很低 – eddi

+0

是的,你是對的。 – DrDom