2015-10-15 73 views
1
returns <- data.frame(date = c('2015.01.01','2015.01.02','2015.01.03','2015.01.04'), 
        Asset1 = as.numeric(c('0.1','0.1','0.1','0.1')), 
        Asset2 = as.numeric(c('0.2','0.2','0.2','0.2')), 
        Asset3 = as.numeric(c('0.3','0.3','0.3','0.3'))) 

Rank <- data.frame(date = c('2015.01.01','2015.01.02','2015.01.03','2015.01.04'), 
        Asset1 = as.numeric(c('3','3','3','3')), 
        Asset2 = as.numeric(c('1','1','1','1')), 
        Asset3 = as.numeric(c('2','2','2','2'))) 

我想在新的數據框中匹配等級1返回到列1。數字和等級可能會發生很大的變化,因此只需移動列就行不通了。我覺得我的英文在第一篇文章中並沒有太清楚。結果應該看起來像這樣。排名在R的回報

Result <- data.frame(date = c('2015.01.01','2015.01.02','2015.01.03','2015.01.04'), 
         Rank1 = as.numeric(c('0.2','0.2','0.2','0.2')), 
         Rank2 = as.numeric(c('0.3','0.3','0.3','0.3')), 
         Rank3 = as.numeric(c('0.1','0.1','0.1','0.1'))) 

由於排名最好(例如清酒)是資產2,所以列Rank1總是會獲得Asset2返回。 Rank2將獲得Asset3的回報,因爲它在整個時間排名第2。這些可以在現實世界中改變,所以會喜歡採取這個帳戶。

這是原來的答案,謝謝你,但它會混淆結果。不知道它在做什麼。

Result1 <- returns 
Result1[-1] <- returns[-1][cbind(1:nrow(Rank),as.numeric(t(Rank[-1])))] 
+1

爲什麼你使用字符而不是數字? – 2015-10-15 07:20:22

+0

我認爲'結果'有一些值不對應於排名 – akrun

+0

中的值我試圖儘可能準確,在結果中找不到錯誤。 – Hakki

回答

0

我們可以使用row/column建立索引。我們order'行'('ri')'秩'數值列,使用'列'索引,cbindrow索引(1:nrow(Rank)),從'returns'數據集提取元素,並將其分配給我們創建的'Result1'早些時候保持相同的結構。

Result1 <- returns 
ri <- c(t(apply(Rank[-1], 1, order))) 
Result1[-1] <- returns[-1][cbind(1:nrow(Rank), ri)] 
names(Result1) <- sub('_.*', '', names(Result1)) 
identical(Result1, Result) 
#[1] TRUE 
+0

排序R < - 函數(x,y)結果1 < - x 結果1 [-1] < - x [-1] [cbind(1:nrow(y),as.numeric(t(y [-1] ))]] return(as.data.frame(Result1)) } – Hakki

+0

那是我在R中的第一個函數,謝謝。它給了我正確的價值觀,但是寫出功能的最好/最好的方式是什麼? – Hakki

+0

@Hakki任何代碼錯誤 – akrun