【发布时间】:2020-08-14 18:30:42
【问题描述】:
(编辑说明:我将标题更改为“R:枚举矩阵的列组合”,从“R grep:将字符串矩阵匹配到列表”以更好地反映解决方案)
我正在尝试将字符串矩阵与列表匹配:以便我最终可以在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)),看看你想出了什么。 -
@mrdwab,我基本上在
getTrades函数中使用combn(names(priceList), 3)和tradeList[[tradeLeg]] <- combn(nodes, i)。然而,往下看,很明显我有很多东西要了解combn。非常感谢所有的帮助。
标签: r