这是一个数据帧
# 5 companies observed each day for 10 days
df <- tibble(
company = rep(LETTERS[1:5], 10),
value = rep(sample(100, 5), 10),
date = rep(seq(as.Date("2020-01-01"), as.Date("2020-01-10"), 1), each = 5)
)
df
现在,数据发生了一些问题,公司E的一些行被删除。
df_error <- df[-c(5, 10, 15, 20), ]
df_error
什么是最简单的Tidyverse添加回E行的方法。价值并不重要。E行的日期与上面的D行的日期相同。
我从以下内容开始,不确定如何继续:
# Find all D occurrences
e_idx <- which(df_error$company == "D")
e_idx
# If there is not an E in the next row, get the index. These need E rows below each index value.
rows_need_e_below <- ifelse(df_error[e_idx + 1, 1] != "E", e_idx, NA)
rows_need_e_below
如果您知道您的数据应该有"A";至";E〃;可以使用complete
:的公司
tidyr::complete(df_error, date, company = LETTERS[1:5])
或者更一般地说:
unique_company <- c('A', 'B', 'C', 'D', 'E')
tidyr::complete(df_error, date, company = unique_company)
# A tibble: 50 x 3
# date company value
# <date> <chr> <int>
# 1 2020-01-01 A 87
# 2 2020-01-01 B 5
# 3 2020-01-01 C 40
# 4 2020-01-01 D 67
# 5 2020-01-01 E NA
# 6 2020-01-02 A 87
# 7 2020-01-02 B 5
# 8 2020-01-02 C 40
# 9 2020-01-02 D 67
#10 2020-01-02 E NA
# … with 40 more rows
默认情况下,value
列是给定的NA
值。如果您想用特定的值填充它,可以使用complete
的fill
参数。例如,要填充0,可以执行以下操作:
tidyr::complete(df_error, date, company = unique_company, fill = list(value = 0))