r-根据条件在数据帧中插入行-Tidyverse方法



这是一个数据帧

# 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值。如果您想用特定的值填充它,可以使用completefill参数。例如,要填充0,可以执行以下操作:

tidyr::complete(df_error, date, company = unique_company, fill = list(value = 0))

最新更新