将每个 ID 中除第一个观察值以外的所有观察值替换为 0

Replace all observations except for the first with 0 in each ID

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

    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]  

但是不行。

您可以通过在 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

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