左连接(或等效)到组编号索引

时间:2015-09-11 19:42:01

标签: r

我有一系列数字(天):

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的数据帧。

非常感谢正确推动。

谢谢!

1 个答案:

答案 0 :(得分:6)

我们可以使用expand.gridmerge。我们使用'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)]