【问题标题】:Maintaining order in split-apply-combine problems [duplicate]在拆分应用组合问题中维护顺序[重复]
【发布时间】:2013-01-23 18:57:31
【问题描述】:

可能重复:
How to ddply() without sorting?

我有以下数据框

dd1 = data.frame(cond = c("D","A","C","B","A","B","D","C"), val = c(11,7,9,4,3,0,5,2))
dd1
  cond val
1    D  11
2    A   7
3    C   9
4    B   4
5    A   3
6    B   0
7    D   5
8    C   2

现在需要根据 cond 中的因子水平计算累积和。结果应如下所示:

> dd2 = data.frame(cond = c("D","A","C","B","A","B","D","C"), val = c(11,7,9,4,3,0,5,2), cumsum=c(11,7,9,4,10,4,16,11))
> dd2
  cond val cumsum
1    D  11     11
2    A   7      7
3    C   9      9
4    B   4      4
5    A   3     10
6    B   0      4
7    D   5     16
8    C   2     11

以与输入数据帧相同的顺序接收结果数据帧很重要,因为还有其他变量与之绑定。

我尝试了ddply(dd1, .(cond), summarize, cumsum = cumsum(val)),但没有产生我预期的结果。

谢谢

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    请改用ave

    dd1$cumsum <- ave(dd1$val, dd1$cond, FUN=cumsum)
    

    【讨论】:

    • +1 ave 是解决这个特殊问题的好工具,但经常被忽视。
    【解决方案2】:

    如果手动执行此操作是一个选项,那么 split()unsplit() 以及中间合适的 lapply() 将为您执行此操作。

    dds <- split(dd1, dd1$cond)
    dds <- lapply(dds, function(x) transform(x, cumsum = cumsum(x$val)))
    unsplit(dds, dd1$cond)
    

    最后一行给出

    > unsplit(dds, dd1$cond)
      cond val cumsum
    1    D  11     11
    2    A   7      7
    3    C   9      9
    4    B   4      4
    5    A   3     10
    6    B   0      4
    7    D   5     16
    8    C   2     11
    

    我将这三个步骤分开,但如果您经常这样做,可以将它们串在一起或放在一个函数中。

    【讨论】:

    • 放在一个函数中...比如ave? :P
    • @JoshuaUlrich 我总是忘记那个!
    • 这是一个非常有用的功能,但由于名称选择不佳而受到阻碍。顺便说一下,+1 用于重新发明轮子。
    【解决方案3】:

    data.table 解决方案:

    require(data.table)
    dt <- data.frame(dd1)
    dt[, c.val := cumsum(val),by=cond]
    > dt
    #    cond val c.val
    # 1:    D  11    11
    # 2:    A   7     7
    # 3:    C   9     9
    # 4:    B   4     4
    # 5:    A   3    10
    # 6:    B   0     4
    # 7:    D   5    16
    # 8:    C   2    11
    

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 2013-10-10
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 2014-03-03
      • 2020-01-06
      • 2011-02-27
      • 1970-01-01
      相关资源
      最近更新 更多