这个问题的后续问题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表示没有数据)?
答案 0 :(得分:0)
您只需要将SIMPLIFY=FALSE
参数设置为mapply
,然后您可以将do.call
与rbind
一起使用,将所有内容放回一个数据框中:
> 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