对这个问题的后续行动,即使这个例子是具体的,这似乎是一个通用的应用程序,所以我认为值得一个单独的线程:
一般的问题是:如何获取列表中与原始数据框中的值相对应的元素,并根据原始数据框中的值组合它们,尤其是当列表中的元素长度不同时?
在这个例子中,我有一个数据框,它有两组,每组按日期排序。我最终想要做的是得到一个按日期组织的数据框,其中只有每个细分的相关指标。如果某个段没有特定日期的数据,则它得到一个 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”部分,我只关心相对于其基准 75 的 (value/a)。对于“xyz”部分,我只关心相对于其基准 0.04 的 (k/x)。
最终我想要一个看起来像这样的数据框:
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 年 1 月 1 日至 2013 年 1 月 3 日的信息,因此之后的所有内容都为 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)?