3

重複の可能性:
ソートせずに ddply() する方法は?

次のデータフレームがあります

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))ましたが、期待した結果が得られませんでした。

ありがとう

4

3 に答える 3

8

ave代わりに使用してください。

dd1$cumsum <- ave(dd1$val, dd1$cond, FUN=cumsum)
于 2013-01-23T19:05:20.357 に答える
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
于 2013-01-23T19:07:32.340 に答える
3

これを手動で行うことがオプションである場合は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

3 つのステップを分けましたが、これをたくさん行う場合は、これらをつなぎ合わせたり、関数に配置したりできます。

于 2013-01-23T19:06:44.760 に答える