gpt4 book ai didi

R:枚举矩阵的列组合

转载 作者:行者123 更新时间:2023-12-04 09:35:21 26 4
gpt4 key购买 nike

(编辑说明:我将标题从“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.framelist,您将为灵 active 留出更多空间.例如,如果你想要行总和,你可以简单地使用 lapply(TradeCombos(priceList, 3), rowSums);无论您要应用什么功能,都可以采用类似的方法。

更新

我不确定为什么@GSee 没有添加这个作为答案,但我认为它非常棒:

获取 data.framelist,如下所示:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com