根据公共数据帧值组合列表元素

时间:2014-03-03 03:29:19

标签: r mapply

这个问题的后续问题here,即使该示例是特定的,这看起来像是一个可推广的应用程序,所以我认为它值得一个单独的线程:

一般问题是:如何获取列表中与原始数据框中的值对应的元素,并根据原始数据框中的值将它们组合,尤其是当列表的元素长度不同时?

在这个例子中,我有一个包含两个组的数据框,每个组按日期排序。我最终想要做的是获取按日期组织的数据框,该数据框只包含每个细分的相关指标。如果某个段没有某个特定日期的数据,则会得到0。

以下是一些实际数据:

structure(list(date = structure(c(15706, 15707, 15708, 15709, 
15710, 15706, 15707, 15708), class = "Date"), segment = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("abc", "xyz"), class = "factor"), 
    a = c(76L, 92L, 96L, 76L, 80L, 91L, 54L, 62L), x = c(964L, 
    505L, 968L, 564L, 725L, 929L, 748L, 932L), k = c(27L, 47L, 
    36L, 40L, 33L, 46L, 30L, 36L), value = c(6872L, 5993L, 5498L, 
    5287L, 6835L, 6622L, 5736L, 7218L)), .Names = c("date", "segment", 
"a", "x", "k", "value"), row.names = c(NA, -8L), class = "data.frame")

因此对于“abc”段,我只关心(值/ a)相对于其75的基准。 而对于“xyz”段,我只关心(k / x)相对于其0.04的基准。

最终我想要一个看起来像这样的数据框:

        date   abc   xyz
1 2013-01-01  0.21  0.24
2 2013-01-02 -0.13  0.00
3 2013-01-03 -0.24 -0.03
4 2013-01-04 -0.07  0.00
5 2013-01-05  0.14  0.00

其中,由于“xyz”只有2013-01-01至2013-01-03的信息,所以之后的所有内容都会获得0。

我如何达到这一点是:

定义要传递给 mapply

的参数
splits <- split(test, test$segment)
metrics <- c("ametric","xmetric")
benchmarks <- c(75,0.04)

以及针对基准测试获得性能的功能

performance <- function(splits,metrics,benchmarks){
    (splits[,metrics]/benchmarks)-1
}

将这些传递给mapply:

temp <- mapply(performance, splits, metrics, benchmarks)

现在的问题是,由于分割的长度不同,输出如下所示:

summary(temp)

    Length Class  Mode   
abc 5      -none- numeric
xyz 3      -none- numeric

有没有办法从每个拆分的原始数据框中引入日期,并根据这些日期进行组合(0表示没有数据)?

1 个答案:

答案 0 :(得分:0)

您只需要将SIMPLIFY=FALSE参数设置为mapply,然后您可以将do.callrbind一起使用,将所有内容放回一个数据框中:

> temp <- mapply(performance, splits, metrics, benchmarks)
> do.call('rbind',mapply(cbind, splits, performance=temp, SIMPLIFY=FALSE))
            date segment  a   x  k value  performance
abc.1 2013-01-01     abc 76 964 27  6872 1.333333e-02
abc.2 2013-01-02     abc 92 505 47  5993 2.266667e-01
abc.3 2013-01-03     abc 96 968 36  5498 2.800000e-01
abc.4 2013-01-04     abc 76 564 40  5287 1.333333e-02
abc.5 2013-01-05     abc 80 725 33  6835 6.666667e-02
xyz.6 2013-01-01     xyz 91 929 46  6622 2.322400e+04
xyz.7 2013-01-02     xyz 54 748 30  5736 1.869900e+04
xyz.8 2013-01-03     xyz 62 932 36  7218 2.329900e+04