R 如何将我的两张桌子进行复杂的装订?

R 如何将我的两张桌子进行复杂的装订?,r,dataframe,binding,R,Dataframe,Binding,我有一个列类型为列的单列数据框,其中包含所有可能的“类型”: 我从数据库中获取数据帧。但在这个数据框架中,并非所有的“类型”都是。下面是该表的示例: ID date type value a1 2020-09-01 enter 18 a1 2020-09-01 close 15 a1 2020-09-02 enter 4 a2 2020

我有一个列类型为列的单列数据框,其中包含所有可能的“类型”:

我从数据库中获取数据帧。但在这个数据框架中,并非所有的“类型”都是。下面是该表的示例:

ID    date            type           value
a1    2020-09-01       enter          18
a1    2020-09-01       close          15
a1    2020-09-02       enter          4
a2    2020-09-01       close          10
b1    2020-09-02       update         10
如您所见,ID a1只有两种类型:enter和close。a2只有关闭,b1只有更新

我希望以这种方式绑定这两个表,以便表中不存在的“类型”对于每个ID和日期都具有零值。那么,如何绑定这两个表以获得:

ID    date            type           value
a1    2020-09-01       enter          18
a1    2020-09-01       open           0
a1    2020-09-01       close          15
a1    2020-09-01       update         0
a1    2020-09-01       delete         0
a1    2020-09-02       enter          4
a1    2020-09-02       open           0
a1    2020-09-02       close          0
a1    2020-09-02       update         0
a1    2020-09-02       delete         0
a2    2020-09-01       enter          0
a2    2020-09-01       open           0
a2    2020-09-01       close          10
a2    2020-09-01       update         0
a2    2020-09-01       delete         0
b1    2020-09-01       enter          0
b1    2020-09-01       open           0
b1    2020-09-01       close          0
b1    2020-09-01       update         10
b1    2020-09-01       delete         0

我该怎么做呢?

您可以尝试使用
complete

library(dplyr)
library(tidyr)

df2 %>%
  mutate(type = factor(type, levels = df1$type)) %>%
  group_by(ID, date) %>%
  complete(type, fill = list(value = 0))

#    ID    date       type   value
#   <chr> <chr>      <fct>  <dbl>
# 1 a1    2020-09-01 enter     18
# 2 a1    2020-09-01 open       0
# 3 a1    2020-09-01 close     15
# 4 a1    2020-09-01 update     0
# 5 a1    2020-09-01 delete     0
# 6 a1    2020-09-02 enter      4
# 7 a1    2020-09-02 open       0
# 8 a1    2020-09-02 close      0
# 9 a1    2020-09-02 update     0
#10 a1    2020-09-02 delete     0
#11 a2    2020-09-01 enter      0
#12 a2    2020-09-01 open       0
#13 a2    2020-09-01 close     10
#14 a2    2020-09-01 update     0
#15 a2    2020-09-01 delete     0
#16 b1    2020-09-02 enter      0
#17 b1    2020-09-02 open       0
#18 b1    2020-09-02 close      0
#19 b1    2020-09-02 update    10
#20 b1    2020-09-02 delete     0
库(dplyr)
图书馆(tidyr)
df2%>%
突变(类型=因子(类型,级别=df1$type))%>%
分组人(ID,日期)%>%
完成(类型,填充=列表(值=0))
#ID日期类型值
#            
#1 a1 2020-09-01输入18
#2 a1 2020-09-01打开0
#3 a1 2020-09-01关闭15
#4 a1 2020-09-01更新0
#5 a1 2020-09-01删除0
#6 a1 2020-09-02输入4
#7 a1 2020-09-02开放0
#8 a1 2020-09-02关闭0
#9 a1 2020-09-02更新0
#10 a1 2020-09-02删除0
#11 a2 2020-09-01输入0
#12 a2 2020-09-01开放0
#13 a2 2020-09-01结束10
#14 a2 2020-09-01更新0
#15 a2 2020-09-01删除0
#16 b1 2020-09-02输入0
#17 b1 2020-09-02开放0
#18 b1 2020-09-02关闭0
#19 b1 2020-09-02更新10
#20 b1 2020-09-02删除0

您可以尝试使用
complete

library(dplyr)
library(tidyr)

df2 %>%
  mutate(type = factor(type, levels = df1$type)) %>%
  group_by(ID, date) %>%
  complete(type, fill = list(value = 0))

#    ID    date       type   value
#   <chr> <chr>      <fct>  <dbl>
# 1 a1    2020-09-01 enter     18
# 2 a1    2020-09-01 open       0
# 3 a1    2020-09-01 close     15
# 4 a1    2020-09-01 update     0
# 5 a1    2020-09-01 delete     0
# 6 a1    2020-09-02 enter      4
# 7 a1    2020-09-02 open       0
# 8 a1    2020-09-02 close      0
# 9 a1    2020-09-02 update     0
#10 a1    2020-09-02 delete     0
#11 a2    2020-09-01 enter      0
#12 a2    2020-09-01 open       0
#13 a2    2020-09-01 close     10
#14 a2    2020-09-01 update     0
#15 a2    2020-09-01 delete     0
#16 b1    2020-09-02 enter      0
#17 b1    2020-09-02 open       0
#18 b1    2020-09-02 close      0
#19 b1    2020-09-02 update    10
#20 b1    2020-09-02 delete     0
库(dplyr)
图书馆(tidyr)
df2%>%
突变(类型=因子(类型,级别=df1$type))%>%
分组人(ID,日期)%>%
完成(类型,填充=列表(值=0))
#ID日期类型值
#            
#1 a1 2020-09-01输入18
#2 a1 2020-09-01打开0
#3 a1 2020-09-01关闭15
#4 a1 2020-09-01更新0
#5 a1 2020-09-01删除0
#6 a1 2020-09-02输入4
#7 a1 2020-09-02开放0
#8 a1 2020-09-02关闭0
#9 a1 2020-09-02更新0
#10 a1 2020-09-02删除0
#11 a2 2020-09-01输入0
#12 a2 2020-09-01开放0
#13 a2 2020-09-01结束10
#14 a2 2020-09-01更新0
#15 a2 2020-09-01删除0
#16 b1 2020-09-02输入0
#17 b1 2020-09-02开放0
#18 b1 2020-09-02关闭0
#19 b1 2020-09-02更新10
#20 b1 2020-09-02删除0

谢谢,是否可以按与df1相同的顺序键入?是的,更新了答案。谢谢,是否可以按与df1相同的顺序键入?是的,更新了答案。