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
添加回 E 行的最简单的 Tidyverse 方法是什么。价值无所谓。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
值。如果你想用特定的值填充它,你可以fill
使用complete
. 例如,要填充 0,您可以执行以下操作:
tidyr::complete(df_error, date, company = unique_company, fill = list(value = 0))
推荐阅读
- android - 无法使用 android Webview 播放视频网址
- angularjs - ng-repeat 不是来自 HTML 模板中 JSON 对象的数据
- c - 调用声明为 func ptr 的函数时,如何在“,”标记之前修复“错误:预期的 ')'
- big-o - 从伪代码中判断它是哪个 Big-O 的规则是什么?
- android - 非初始化进程/文件的 SElinux 域转换(Android Natvie)
- c# - 为什么 PictureBox.Invalidate() 会导致程序崩溃?System.AccessViolationException
- javascript - 单击以在两个列表之间交换元素
- php - 从 php 表中从选中的复选框中检索数据
- mysql - 进房限制DB
- c++ - mysql C 连接器函数在类中定义时不起作用