在 R 中排名 returns

Ranked returns in R

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 returns 与新数据框中的第 1 列匹配。数字和排名可能会发生很大变化,因此仅移动列是行不通的。我认为我的英语一开始就不太清楚 post。结果应该是这样的。

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 将始终获得资产 2 return。 Rank2 将获得 Asset3 return,因为它一直排名 2。这些在现实世界中可能会发生变化,因此请考虑到这一点。

这是原答案,谢谢,但它会混淆结果。不知道它到底在做什么。

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

我们可以使用 row/column 索引。我们 order 按行 'Rank' 数字列 ('ri'),将其用作 'column' 索引,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