将每个 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
我有一个看起来像这样的数据集。
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