(编辑说明:我将标题更改为“R:枚举矩阵的列组合”,从“R grep:将字符串矩阵匹配到列表”以更好地反映解决方案)
我正在尝试将字符串矩阵与列表匹配:以便我最终可以在稍后对 a 的操作中将该矩阵用作映射data.frame
。
第一部分按预期工作,返回所有可能的对、三元组和四元组组合的列表(尽管这种方法可能创建了我的绑定?):
priceList <- data.frame(aaa = rnorm(100, 100, 10), bbb = rnorm(100, 100, 10),
ccc = rnorm(100, 100, 10), ddd = rnorm(100, 100, 10),
eee = rnorm(100, 100, 10), fff = rnorm(100, 100, 10),
ggg = rnorm(100, 100, 10))
getTrades <- function(dd, Maxleg=3)
{
nodes <- colnames(dd)
tradeList <- list()
for (i in 2:Maxleg){
tradeLeg <- paste0('legs',i)
tradeList[[tradeLeg]] <- combn(nodes, i)
}
return(tradeList)
}
tradeCombos <- getTrades(priceList, 4)
我现在想把这个可能的组合列表变成交易。例如:
> tradeCombos[[1]][,1]
[1] "aaa" "bbb"
需要最终成为priceList[,2] - priceList[,1]
,等等。
我已经尝试了一些使用grep
类似命令的方法,并且觉得我已经接近了以下内容:
LocList <- sapply(tradeCombos[[1]], regexpr, colnames(priceList))
但是该格式不太适合下一步。
理想情况下,LocList[1]
会返回如下内容:1 2
假设tradeCombos[[1]][,1] == "aaa" "bbb"
.
有人可以帮忙吗?
__
在以下所有答案的帮助下,我现在得到了:
colDiff <- function(x)
{
Reduce('-', rev(x))
}
getTrades <- function(dd, Maxleg=3)
{
tradeList <- list()
for (i in 2:Maxleg){
tradeLeg <- paste0('legs',i)
tradeLegsList <- combn(names(dd), i,
function(x) dd[x], simplify = FALSE)
nameMtx <- combn(names(dd), i)
names(tradeLegsList) <- apply(nameMtx, MARGIN=2,
FUN=function(x) paste(rev(x), collapse='*'))
tradeList[[tradeLeg]] <- lapply(tradeLegsList, colDiff)
}
return(tradeList)
}
tradeCombos <- getTrades(priceList, 4)
这保留了组成部分的名称,这是我试图实现的一切。
非常感谢大家的帮助。