0

データフレームの経過時間を計算しようとしています。経過時間の「開始」値は、データフレームの因子列の値によって異なります。(簡単に言うと、時間の値を時間オブジェクトではなく数値として扱います。私の質問は、時間オブジェクトではなく、split-apply-combineに関するものです)。私のデータフレームは次のようになります。

df <- data.frame(id=gl(2, 3, 5, labels=c("a", "b")), time=1:5)

各時間から各要素レベルの最小時間を差し引いて経過時間を計算したいと思います(ただし、この例では、時間値ではなく数値のみを扱います)。したがって、データフレームをで分割し、列の各要素からid最小値を減算して、変換された値を含むベクトル(またはデータフレーム)を返します。私は次のようなものになりたいです:yy

> dfTrans
id  time  elapsed
a      1        0
a      2        1
a      3        2
b      4        0
b      5        1   

plyrにとっては完璧な作業のようですが、簡単な解決策を見つけることができません。

私が思いつくことができる最高のものは

elapsed <- dlply(df, .(id), function(x) x$time - min(x$time))
elapsed_comb <- NA
for(i in 1:length(names(elapsed))) {
  elapsed_comb <- c(elapsed_comb, elapsed[[i]])
}
elapsed_comb <- elapsed_comb[-1]
df$elapsed <- elapsed_comb

これはエレガントではなく、壊れやすいようです。確かにもっと良い方法がありますか?

4

2 に答える 2

3

'ave'関数は、結果がデータフレームの行数と同じ長さのベクトルになる場合に最初に考える必要があります。

 df$elapsed <- ave(df$time, df$id, FUN=function(x) x -min(x) )
 df
  id time elapsed
1  a    1       0
2  a    2       1
3  a    3       2
4  b    4       0
5  b    5       1
于 2012-06-24T04:51:47.633 に答える
2

これがddplyソリューションです

ddply(df, .(id), summarize, time = time, elapsed = seq(length(id))-1)

代わりにrleを使用するもの

df$elapsed <- unlist(sapply(rle(as.numeric(df$id))$lengths, seq))-1
于 2012-06-24T02:06:27.283 に答える