2016-04-12 11 views
0

このようなデータセットがあります。各IDの最初の0以外のすべての観測値を0に置き換えます。

ID date price day 
    a  2005/5 100 16 
    a  2005/6 110 1 
    a  2005/7 90  1 
    b  2005/5 90  20 
    b  2005/6 100 1 
    b  2005/7 90  1 
    c  2005/5 90  3 
    c  2005/6 95  1 
    c  2005/7 100 1 

日のコラムのために、私は0 に最初の行を除くすべての行を交換したいので、私の望ましい結果は以下の通りです。

ID date price day 
    a  2005/5 100 16 
    a  2005/6 110 0 
    a  2005/7 90  0 
    b  2005/5 90  20 
    b  2005/6 100 0 
    b  2005/7 90  0 
    c  2005/5 90  3 
    c  2005/6 95  0 
    c  2005/7 100 0 

私は、このような

rbonds1 <- as.data.table(rbonds1) 
    setkey(rbonds1,ID,date) 
    rbonds1[rbonds1[-1, 21]==0,by=ID] 

などのコマンドを使用して試してみました。しかし、それは動作しません。

答えて

3

あなたはIDが複製されるたびに0とdayを置き換えることによって、これを行うことができます。

rbonds1$day[duplicated(rbonds1$ID)] <- 0 
rbonds1 
# ID date price day 
# 1 a 2005/5 100 16 
# 2 a 2005/6 110 0 
# 3 a 2005/7 90 0 
# 4 b 2005/5 90 20 
# 5 b 2005/6 100 0 
# 6 b 2005/7 90 0 
# 7 c 2005/5 90 3 
# 8 c 2005/6 95 0 
# 9 c 2005/7 100 0 
+0

ニース。あなたは2秒で私を打ち負かす... – lmo

+0

@josliber私は素早く別の質問があります。他のすべての変数を各IDの最初の行の値として置き換えたい場合は、 'rbonds1 $ day [duplicated(rbonds1 $ ID)] < - rbonds1 $ day [!duplicated(rbonds1 $ ID)]'を実行できますか? – hk824

+0

@ hk824したがって、各グループIDから、dayの最初の値ですべての値を置き換えますか? –

0

data.tableを使用してオプション(OPはdata.tableにいくつかの試みを示したもの)。 'data.frame'を 'ID'でグループ化した 'data.table'(setDT(df1))に変換し、シーケンスが1でない行インデックス(.I)を取得し、その列( 'V1')を抽出して )これらの行の 'day'を0に設定します。

library(data.table) 
setDT(df1)[df1[,.I[1:.N!=1] , by = ID]$V1, day:=0][] 
# ID date price day 
#1: a 2005/5 100 16 
#2: a 2005/6 110 0 
#3: a 2005/7 90 0 
#4: b 2005/5 90 20 
#5: b 2005/6 100 0 
#6: b 2005/7 90 0 
#7: c 2005/5 90 3 
#8: c 2005/6 95 0 
#9: c 2005/7 100 0