2017-05-04 4 views
2

は、私が構築され、簡単なシナリオです:前の行の値を使用するR data.frameの変数をうまく計算するにはどうすればよいですか?ここ

は、私は次のことを持っていると言う:

set.seed(1) 
id<-sample(3,10,replace = TRUE) 
n<-1:10 
x<-round(runif(10,30,40)) 
df<-data.frame(id,n,x) 
df 
    id n x 
1 1 1 32 
2 2 2 32 
3 2 3 37 
4 3 4 34 
5 1 5 38 
6 3 6 35 
7 3 7 37 
8 2 8 40 
9 2 9 34 
10 1 10 38 

x.lagは、同じIDまたは0の場合のために、以前のxここでどのように私はエレガントx.lagを計算します以前の値は存在しません。

これは私がやったことですが、私はそれに満足していないよ:

df$x.lag<-rep(0,10) 
for (id in 1:3) 
df[df$id==id,]$x.lag<-c(0,df[df$id==id,]$x)[1:sum(df$id==id)] 
df 
    id n x x.lag 
1 1 1 32  0 
2 2 2 32  0 
3 2 3 37 32 
4 3 4 34  0 
5 1 5 38 32 
6 3 6 35 34 
7 3 7 37 35 
8 2 8 40 37 
9 2 9 34 40 
10 1 10 38 38 

答えて

5

我々はdata.table

library(data.table) 
setDT(df)[, x.lag := shift(x, fill=0), id] 

それともdplyr

library(dplyr) 
df %>% 
    group_by(id) %>% 
    mutate(x.lag = lag(x, default = 0)) 

とを使用することができます

それともbase R

df$x.lag <- with(df, ave(x, id, FUN = function(x) c(0, x[-length(x)]))) 
df$x.lag 
#[1] 0 0 32 0 32 34 35 37 40 38 
+3

ええからave使用して、あなたは秒で私を打つ:) – neilfws

+0

私はみんな@neilfwsあなたの嫉妬しています - 1は私があったことのように感じる禅 – user1172468

+1

のこのレベルに達していませんか私の一日を作ってくれてありがとうございました – user1172468

関連する問題