替换除第一个之外的所有观察,每个ID

时间:2016-04-12 19:31:07

标签: r replace data.table panel-data

我有一个看起来像这样的数据集。

    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   

对于day列,我想将除第一行之外的每一行替换为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]  

但它不起作用。

2 个答案:

答案 0 :(得分:3)

每当day重复时,您可以将ID替换为0来执行此操作:

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

答案 1 :(得分:0)

使用data.table的选项(因为OP在data.table中显示了一些尝试)。将'data.frame'转换为'data.table'(setDT(df1)),按'ID'分组,我们得到行索引(.I),其中序列不是1,提取该列( '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