R:枚举矩阵的列组合

标签 r

(编辑说明:我将标题从“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/

相关文章:

r - 如何将 2 行或更多行文本合并为 1 行,条件是 R

r - 如何使用其他列 (R) 中的值创建列?

r - 检查包名称是否属于 CRAN 归档包

r - 计算不同行的列之间的时间差(difftime)

MCMCglmm 中的重复测量

css - 我可以将正文与边注对齐吗?

arrays - 如何在 R 中提取 1x1 数组切片作为矩阵?

web-services - 如何将 R 集成到 Web 应用程序中

r - 连续时间数据的分位数

python - 在 Python 中运行 lmer(线性混合效应回归)