(编辑备注:我将标题从“R grep:将字符串矩阵与列表匹配”更改为“R:枚举矩阵的列组合”,以更好地反映解决方案)
我正在尝试将一个字符串矩阵与一个列表匹配:这样我最终可以在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)
这将保留组成部分的名称,并且这正是我试图实现的所有内容。
感谢大家的帮助。
combn
函数!尝试使用combn(names(priceList, 2))
或者combn(names(priceList, 3))
,看看能得到什么结果。 - A5C1D2H2I1M1N2O1R2T1getTrades
函数中基本上使用了combn(names(priceList), 3)
,并且使用tradeList[[tradeLeg]] <- combn(nodes, i)
。然而,从下面看来,我显然还有很多关于combn
的知识需要学习。非常感谢您的所有帮助。 - ricardo