我有一系列数字(天):
dayNum <- c(1:10)
我有一个id,day和event的数据框:
id = c("aa", "aa", "aa", "bb", "bb", "cc")
day = c(1, 2, 3, 1, 6, 2)
event = c("Y", "Y", "Y", "Y", "Y", "Y")
df = data.frame(id, day, event)
看起来像这样:
id day event
aa 1 Y
aa 2 Y
aa 3 Y
bb 1 Y
bb 6 Y
cc 2 Y
我正在尝试将此数据框放入一个类似于左边连接dayNum的表单中,每个id都带有df。也就是说,即使id&#34; aa&#34;在第5天没有发生任何事件,我仍然应该为#34; aa&#34;在第5天,N / A或事件发生。像这样:
id day event
aa 1 Y
aa 2 Y
aa 3 Y
aa 4 N/A
aa 5 N/A
aa 6 N/A
aa 8 N/A
aa 9 N/A
aa 10 N/A
bb 1 Y
bb 2 N/A
bb 3 N/A
bb 4 N/A
bb 5 N/A
bb 6 Y
bb 7 N/A
...etc
当我的数据帧只包含一个唯一ID时,我可以使用dplyr和left_join来完成这项工作,但是我很难尝试使用具有许多不同ID的数据帧。
非常感谢正确推动。
谢谢!
答案 0 :(得分:6)
我们可以使用expand.grid
和merge
。我们使用'df'的unique
'id'和'dayNum'创建一个新的数据集。然后使用'df'merge
获得预期的输出。
merge(expand.grid(id=unique(df$id), day=dayNum), df, all.x=TRUE)
# id day event
#1 aa 1 Y
#2 aa 2 Y
#3 aa 3 Y
#4 aa 4 <NA>
#5 aa 5 <NA>
#6 aa 6 <NA>
#7 aa 7 <NA>
#8 aa 8 <NA>
#9 aa 9 <NA>
#10 aa 10 <NA>
#11 bb 1 Y
#12 bb 2 <NA>
#13 bb 3 <NA>
#14 bb 4 <NA>
#15 bb 5 <NA>
#16 bb 6 Y
#17 bb 7 <NA>
#18 bb 8 <NA>
#19 bb 9 <NA>
#20 bb 10 <NA>
#21 cc 1 <NA>
#22 cc 2 Y
#23 cc 3 <NA>
#24 cc 4 <NA>
#25 cc 5 <NA>
#26 cc 6 <NA>
#27 cc 7 <NA>
#28 cc 8 <NA>
#29 cc 9 <NA>
#30 cc 10 <NA>
使用data.table
的类似选项是将'data.frame'转换为'data.table'(setDT(df
),设置'key'列,使用从cross派生的数据集连接加入独特的'id'和'dayNum'。
library(data.table)
setDT(df, key=c('id', 'day'))[CJ(id=unique(id), day=dayNum)]