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

R 将除第一个以外的所有观察值替换为每个ID中的0,r,replace,data.table,panel-data,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

我有一个类似这样的数据集

    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]  

rbonds1只要重复了
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

rbonds1$day[duplicated(rbonds1$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

rbonds1$day[duplicated(rbonds1$ID)]一个使用
data.table
的选项(正如OP在
data.table
中显示的一些尝试)。将'data.frame'转换为'data.table'(
setDT(df1)
),按'ID'分组,我们得到序列不是1的行索引(
.I
),提取该列('V1'),并为这些行将(
:=
)日期指定为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

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

@乔斯里伯,我还有一个问题。我能做
rbonds1$day[duplicated(rbonds1$ID)]@hk824吗?所以你想用每个组ID中的第一个day值替换day中的所有值吗?@hk824你可以试试:
library(dplyr);rbonds1%>%groupby(ID)%>%mutate(day=first(day))
@josliber我还有一个快速的问题。我能做
rbonds1$day[duplicated(rbonds1$ID)]@hk824吗?所以你想用每个组ID中的第一个day值替换day中的所有值吗?@hk824你可以试试:
library(dplyr);rbonds1%>%group\U by(ID)%>%mutate(天=第一天))