有没有办法使用 dplyr 用 0 填充缺失的日期?
Is there a way to fill in missing dates with 0s using dplyr?
我有这样的数据集:
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
函数,因为我正在使用 sparklyr
,而且据我所知,需要留在 dplyr
函数内。
在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,但事实可能并非如此。
expand.grid()
使用expand.grid()
创建id
和date
的所有组合。对了,注意把你的日期改成as.Date()
class 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))
我有这样的数据集:
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
函数,因为我正在使用 sparklyr
,而且据我所知,需要留在 dplyr
函数内。
在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,但事实可能并非如此。
expand.grid()
使用expand.grid()
创建id
和date
的所有组合。对了,注意把你的日期改成as.Date()
class 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))