2

これは、データフレーム内のグループ化された各行の値から前年の減算を拡張したものです。plyrを使用するオプションは完全に理にかなっています。

今、私はさらにいくつかの列を追加しようとしています。年も変更したので、IDごとに開始点が異なる実際の年になります。タブ区切りのdfへのリンクは次のとおりです:https ://dl.dropbox.com/u/9699533/df.txt

ここに画像の説明を入力してください

現在の行にいるときに、前の行へのポインタを取得できません。これをplyr::transformの関数部分に渡したいと思います。どうやってこれを書けばいいですか?ありがとう!

〜〜〜〜代替データフレーム入力〜〜〜〜〜 _ _ _

> dput(df)
structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
4L, 4L, 5L, 5L, 5L), value = c(6L, 16L, 21L, 5L, 10L, 26L, 2L, 
12L, 26L, 9L, 16L, 26L, 2L, 15L, 29L), year = c(2007L, 2008L, 
2009L, 2011L, 2012L, 2013L, 2004L, 2004L, 2006L, 2010L, 2011L, 
2012L, 2014L, 2015L, 2016L), actual = c(6L, 10L, 5L, 5L, 5L, 
16L, 2L, 10L, 14L, 9L, 7L, 10L, 2L, 13L, 14L)), .Names = c("id", 
"value", "year", "actual"), class = "data.frame", row.names = c(NA, 
-15L))
4

1 に答える 1

3

使用しないでくださいtransform

foo <- function(x){
   x$ratio <- c(NA,tail(x$actual,-1)/head(x$value,-1))
   x
 }
> 
> ddply(df,.(id),foo)
   id value year actual     ratio
1   1     6 2007      6        NA
2   1    16 2008     10 1.6666667
3   1    21 2009      5 0.3125000
4   2     5 2011      5        NA
5   2    10 2012      5 1.0000000
6   2    26 2013     16 1.6000000
7   3     2 2004      2        NA
8   3    12 2004     10 5.0000000
9   3    26 2006     14 1.1666667
10  4     9 2010      9        NA
11  4    16 2011      7 0.7777778
12  4    26 2012     10 0.6250000
13  5     2 2014      2        NA
14  5    15 2015     13 6.5000000
15  5    29 2016     14 0.9333333

データフレームが並べ替えられており、各グループの大きさが(byでid)わかっている場合は、分割適用全体を実行する必要はありません。

df$ratio2 <- with(df,c(NA,tail(actual,-1) / head(value,-1)))
df$ratio2[seq(1,nrow(df),by = 3)] <- NA
于 2012-12-21T03:52:43.993 に答える