有没有一种方法可以使用dplyr用0来填充缺失的日期?

有没有一种方法可以使用dplyr用0来填充缺失的日期?,r,apache-spark,dplyr,sparklyr,R,Apache Spark,Dplyr,Sparklyr,我有这样一个数据集: id date value 1 8/06/12 1 1 8/08/12 1 2 8/07/12 2 2 8/08/12 1 每个id对于每个日期都应该有一个值。当id缺少特定日期时,需要将该行的值添加为0。例如: id date value 1 8/06/12 1 1 8/07/12 0

我有这样一个数据集:

id  date     value      
1   8/06/12    1         
1   8/08/12    1         
2   8/07/12    2         
2   8/08/12    1         
每个id对于每个日期都应该有一个值。当id缺少特定日期时,需要将该行的值添加为0。例如:

id  date     value      
1   8/06/12    1   
1   8/07/12    0      
1   8/08/12    1  
2   8/06/12    0         
2   8/07/12    2         
2   8/08/12    1     

我正在尝试找出如何添加0的行。这里有一个很好的解决方案:。但是,我不能使用
tidyr::complete
函数,因为我使用的是
sparkyr
,据我所知,我需要保持在
dplyr
函数中

sparkyr
中,必须使用Spark函数。这是一个用于合并的作业。首先,您必须填写您希望看到的所有ID和日期对,因此可能类似于: (编辑

all_id%不同(id)%%>%变异(common=0)
所有日期%不同(日期)%>%变异(通用=0)
全部加入(全部加入日期,由class='common')
数据%
右键连接(全部都%>%select(-common),by=c('id','date'))%>%
mutate(值=`coalesce(值,0)`)
我假设您在旧数据中有所有您关心的日期和ID,但情况可能并非如此。

expand.grid()

使用
expand.grid()
创建
id
date
的所有组合。顺便说一下,请注意将日期转换为类
date
By
as.date()
,否则它将是一个无意义的字符串

df %>% mutate(date = as.Date(date, "%m/%d/%y")) %>%
  right_join(expand.grid(id = unique(.$id), date = unique(.$date))) %>%
  mutate(value = coalesce(value, 0L)) %>% 
  arrange(id, date)

#   id       date value
# 1  1 2012-08-06     1
# 2  1 2012-08-07     0
# 3  1 2012-08-08     1
# 4  2 2012-08-06     0
# 5  2 2012-08-07     2
# 6  2 2012-08-08     1

可再现数据

df <- structure(list(id = c(1L, 1L, 2L, 2L), date = c("8/06/12", "8/08/12", 
"8/07/12", "8/08/12"), value = c(1L, 1L, 2L, 1L)), class = "data.frame", row.names = c(NA, 
-4L))

df现在我想起来了,我的代码不会完全满足您的要求;你需要在所有日期和ID上右键连接…
full\u-join
似乎比
right\u-join
更安全,以防所有日期中的日期丢失,它们不会被悄悄删除。我的Sparkyr格言是:第十二次是一种魅力。很好的解决方案。但是我认为第三行代码(完全联接)不起作用,因为
all\u id
all\u date
没有公共变量。没错。再次编辑以具有公共字段。
expand.grid
将在
data.frame
上运行良好,但必须将其复制到spark中。我相信这样做的魔法咒语是在连接中使用
copy
参数。类似于
right\u join(my\u local\u df,by=…,copy=TRUE)
。感谢您的建议!在看到你的评论之前,我没有注意到这一点。
df <- structure(list(id = c(1L, 1L, 2L, 2L), date = c("8/06/12", "8/08/12", 
"8/07/12", "8/08/12"), value = c(1L, 1L, 2L, 1L)), class = "data.frame", row.names = c(NA, 
-4L))