有没有一种方法可以使用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
Byas.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))