1

我有一个 data.frames 列表,并且想使用各种权重对它们的列进行操作。

例如,从第二列中减去第一列(已解决,见下文);或从第二个的两倍(未解决)中减去第一个和第三个。

感谢在回答这个问题时获得的慷慨帮助,我在没有权重的情况下使用Reduce.

我希望能够灵活地使用重量 - 并且在更高的维度上。

到目前为止,我所拥有的是:

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)
                        )

colDiff <- function(x) 
    {
        Reduce('-', rev(x))
    }

tradeLegsList <- combn(names(priceList), 3, function(x) priceList[x], simplify = FALSE)

tradeList <- lapply(tradeLegsList, colDiff)

据我所知,Reduce它并非旨在接受多个论点。

我可以用 , 和一些循环来做这个很长的路要走2* tradeLegsList[[1]]$bbb - tradeLegsList[[1]]$aaa - tradeLegsList[[1]]$ccc,但它看起来不像R 方式

有没有办法传入权重向量?

w = c(-1, 2, -1)理想情况下,我会传递一个参数,例如colDiff(或Reduce)函数......或类似的东西。

4

1 回答 1

3

确实,Reduce不适合允许多个参数,每次减少两个参数。因此,最简单的方法是预乘您正在处理的列表中的元素Reduce

以下是mapply在您的colDiff函数定义中使用此功能的解决方案。

更改 colDiff 的定义以允许权重向量,并使用mapply with应用它SIMPLIFY = F

编辑

根据评论,权重取决于列数,不需要rev

长度加权

长度(x) == 1 -> w = 1
长度(x) == 2 -> w = c(-1, 1),
长度(x) == 3 -> w = c(-1, 2, - 1),
长度(x) == 4 -> w = c(-1, 1, -1, +1)

weighting <- function(i){
  switch(i, 1, c(-1,1), c(-1,2,-1), c(-1,1,-1, 1))
}
colDiff <- function(x) 
    {
        w = weighting(length(x))
        Reduce('+', mapply('*', x, e2 = w, SIMPLIFY = F))
    }

然后像这样的东西会起作用

tradeList <- lapply(tradeLegsList, colDiff)

您还可以保留函数式编程主题并使用它是withMap的简单包装器mapplySIMPLIFY = F

colDiff <- function(x) 
        {
            w = weighting(length(x))
            Reduce('+', Map('*', x , e2 = w))
        }

您还可以在函数 colDiff 中预定义权重(这可能更容易)。 weighting[[2]]当有 2 列时加权,当有 3 列weighting[[3]]时。

colDiff <- function(x) 
        {
         weighting <- list(1, c(-1,1), c(-1,2,-1), c(-1,1,-1, 1))             
            w = weighting[[length(x)]]
            Reduce('+', Map('*', x , e2 = w))
        }
于 2012-09-12T04:42:40.220 回答