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(天=第一天))