Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据公共数据帧值组合列表元素_R_Mapply - Fatal编程技术网

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

R 根据公共数据帧值组合列表元素,r,mapply,R,Mapply,这个问题的后续问题是,尽管示例是具体的,但这似乎是一个可推广的应用程序,因此我认为值得单独讨论: 一般问题是:如何获取列表中与原始数据帧中的值相对应的元素,并根据原始数据帧中的值组合它们,特别是当列表中的元素长度不同时 在本例中,我有一个数据框,它有两个组,每个组按日期排序。我最终想要做的是得到一个按日期组织的数据框架,它只包含每个片段的相关度量。如果某个段没有某个日期的数据,它将得到0 以下是一些实际数据: structure(list(date = structure(c(15706, 15

这个问题的后续问题是,尽管示例是具体的,但这似乎是一个可推广的应用程序,因此我认为值得单独讨论:

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

在本例中,我有一个数据框,它有两个组,每个组按日期排序。我最终想要做的是得到一个按日期组织的数据框架,它只包含每个片段的相关度量。如果某个段没有某个日期的数据,它将得到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的价值/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-01-01至2013-01-03的信息,因此之后的所有信息均为0

我是如何做到这一点的:

定义要传递给mapply的参数

是否有方法从原始数据帧中为每个拆分引入日期,并根据这些日期与没有数据的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

对于一般的问题,也许可以看一些像reformedo.callrbind,splits,direction=wide,idvar=date,timevar=segment,drop=ca,x,kAh这样的东西,这非常有用。然后,如果我最终想要一个像我上面提到的切割一样的矩阵,我假设最简单的方法就是假设我们调用新的do.call dataframe dataframe:dcastdataframe[,c1,2,7],date~segment,value.var=performance
performance <- function(splits,metrics,benchmarks){
    (splits[,metrics]/benchmarks)-1
}
temp <- mapply(performance, splits, metrics, benchmarks)
summary(temp)

    Length Class  Mode   
abc 5      -none- numeric
xyz 3      -none- numeric
> 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