我有一个看起来像这样的数据集。
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]
但它不起作用。
答案 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