对数据进行填补
Jun 9, 2021
1 minute read

今天整理数据的时候,需要使用数据集 2 对数据集 1 里缺失的部分进行填补,而两者重复的部分,优先保留数据集 1 里的。

这个问题其实很简单,只需短短 2-3 行:

result <- data1 %>%
  left_join(data2) %>%
  mutate(value = ifelse(is.na(value.x), value.y, value.x))

但我遇到的问题稍微多一点点难度,日期的序列不是连续的话,例如数据集 1:

# date       value
# 2014-01-01 12
# 2014-01-03 14
# 2014-01-05 17

数据集 2:

# date       value
# 2014-01-02 13
# 2014-01-03 16
# 2014-01-04 15

那么希望得到的结果是:

# date       value
# 2014-01-01 12
# 2014-01-02 16
# 2014-01-03 14
# 2014-01-04 15
# 2014-01-05 17

我们会需要先生成一个日期的模板:

template <- tibble(
  date = seq(as.Date("2013/1/1"), as.Date("2017/12/31"), "days"
)

template %>%
  left_join(data1, by="date") %>%
  left_join(data2, by-"date") %>%
  mutate(value = ifelse(is.na(value.x), value.y, value.x))

当然,如果数据维度上升,比如多了一个城市维度的话,只需要在模板上更改一下也能解决了:

template <- tibble(
  city = rep(city_codes, each=len1),
  date = rep(seq(as.Date("2013/1/1"), as.Date("2017/12/31"), "days"), len2)
)

template %>%
  left_join(data1, by=c("date", "city")) %>%
  left_join(data2, by-c("date", "city")) %>%
  mutate(value = ifelse(is.na(value.x), value.y, value.x))

这里需要注意生成模板的两个变量重复的次数和参数设置,另外下面的合并键也要加入新的变量。