在 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' 索引,cbind
和 row
索引 (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
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' 索引,cbind
和 row
索引 (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