首页 文章

在dplyr中组合有序条件下的不同组

提问于
浏览
1

抱歉这个令人困惑的 Headers . 假设我有一个定义的样本数据集:

date_seq = seq(as.Date("2010/1/1"), as.Date("2015/1/1"), "years")
testdf = data.frame( date = rep(date_seq, 3), 
            group= c(rep(1, length(date_seq)), rep(2, length(date_seq)), rep(3, length(date_seq)) ),
            value = runif( 3*length(date_seq) ) )

df看起来像:

date group      value
1  2010-01-01     1 0.87025714
2  2011-01-01     1 0.11047751
3  2012-01-01     1 0.72883205
4  2013-01-01     1 0.74132252
5  2014-01-01     1 0.55877268
6  2015-01-01     1 0.98447795
7  2010-01-01     2 0.22791086
8  2011-01-01     2 0.71533778
9  2012-01-01     2 0.71589941
10 2013-01-01     2 0.72400212
11 2014-01-01     2 0.81055940
12 2015-01-01     2 0.68812890
13 2010-01-01     3 0.60479478
14 2011-01-01     3 0.64756971
15 2012-01-01     3 0.86421177
16 2013-01-01     3 0.99849809
17 2014-01-01     3 0.96150739
18 2015-01-01     3 0.05425983

将第3组的值除以第1组的值的最简单方法是什么?我知道我可以在日期中将数据与自身合并然后除以,但这有点笨拙 . 欢迎使用dplyr功能 .

编辑:我提供了一个非常有礼貌的数据集 . 如果答案足够强大以处理缺失的日期(例如,如果缺少组1的2011-01-01点),并且未订购日期,那也很好 .

1 回答

  • 0

    您可以尝试以下方法(它可以在更少的步骤中完成,但我宁愿在下面详细说明):

    #split into groups
    df2 <- split(testdf, as.factor(testdf$group))
    
    #order each group according to date
    df2[] <- lapply(df2, function(x) x[order(x$date),])
    
    #cbind the two groups to remove NAs using na.omit
    df3 <- cbind(df2[[1]], df2[[3]])
    df3 <- na.omit(df3)
    
    #divide the values to produce final output
    df4 <- cbind(df3[1], df3[3]/df3[6])
    

    输出:

    > df4
            date      value
    1 2010-01-01 0.04760063
    2 2011-01-01 0.10221574
    3 2012-01-01 0.61679424
    4 2013-01-01 0.02227756
    5 2014-01-01 0.28233571
    6 2015-01-01 1.49104843
    

相关问题