2015-10-15 63 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