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

时间:2019-01-23 17:43:11

标签: 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      
1   8/08/12    1  
2   8/06/12    0         
2   8/07/12    2         
2   8/08/12    1     

我试图弄清楚如何添加带有0的行。这里有一个很好的解决方案:R - Fill missing dates by group。但是,我无法使用tidyr::complete函数,因为我正在使用sparklyr,并且据我所知,需要保留在dplyr函数中。

2 个答案:

答案 0 :(得分:3)

sparklyr中,您必须使用Spark函数。这是coalesce的工作。首先,您必须填写希望看到的所有ID和日期对,所以可能是这样的: (编辑

all_id <- old_data %>% distinct(id) %>% mutate(common=0)
all_date <- old_data %>% distinct(date) %>% mutate(common=0)
all_both <- all_id %>% full_join(all_date,by='common')
data <- old_data %>%
  right_join(all_both %>% select(-common),by=c('id','date')) %>%
  mutate(value=`coalesce(value,0)`)

我假设您在旧数据中拥有所有您关心的日期和ID,尽管事实并非如此。

答案 1 :(得分:1)

expand.grid()

使用expand.grid()创建iddate的所有组合。顺便说一下,请注意将日期更改为Date到类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))