(编辑说明:我将标题从“R grep:将字符串矩阵匹配到列表”更改为“R:枚举矩阵的列组合”以更好地反射(reflect)解决方案)
我正在尝试将一个字符串矩阵与一个列表相匹配:这样我最终可以在以后对 data.frame
的操作中将该矩阵用作映射。
这第一部分按预期工作,返回所有可能的对、三元组和四元组组合的列表(尽管这种方法可能创建了我的绑定(bind)?):
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
。此解决方案不会将您带到最后一步,而是创建一个 data.frames
列表。从那里开始,很容易使用 lapply
来完成您的最后一步。
这是简化的函数:
TradeCombos <- function(dd, MaxLeg) {
combos = combn(names(dd), MaxLeg)
apply(combos, 2, function(x) dd[x])
}
要使用它,只需指定您的数据集和您要查找的组合数。
TradeCombos(priceList, 3)
TradeCombos(priceList, 4)
继续:@mplourde 向您展示了如何使用 Reduce
进行连续减法。此处将采用类似的方法:
cumDiff <- function(x) Reduce("-", rev(x))
lapply(TradeCombos(priceList, 3), cumDiff)
通过将 TradeCombos
函数的输出保留为 data.frame
的 list
,您将为灵 active 留出更多空间.例如,如果你想要行总和,你可以简单地使用 lapply(TradeCombos(priceList, 3), rowSums)
;无论您要应用什么功能,都可以采用类似的方法。
更新
我不确定为什么@GSee 没有添加这个作为答案,但我认为它非常棒:
获取 data.frame
的 list
,如下所示:
combn(names(priceList), 3, function(x) priceList[x], simplify = FALSE)
根据需要提前。 (例如,使用我们创建的 cumDiff
函数:combn(names(priceList), 2, function(x) cumDiff(priceList[x]), simplify = FALSE)
.)
关于R:枚举矩阵的列组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12368674/