r - 从两个不同的列满足条件时检索后续行
问题描述
我有一个数据框,其中包含如下所示的数据:
Part Number Vendor Name Position Repair
123 ABC 1 2
NA <NA> 2 4
NA <NA> 3 1
NA <NA> 4 5
NA <NA> 5 6
NA <NA> 6 3
123 XYZ 1 4
NA <NA> 2 5
NA <NA> 3 7
NA <NA> 4 1
NA <NA> 5 2
NA <NA> 6 3
NA <NA> 7 6
我有一个部件号和供应商名称分组。每当位置列 > 3 并且修复 ==1 时,检索后续行。
假设在零件编号 =123 和供应商名称 =ABC 的给定示例中,修复 ==1 位于第三位置 [位置=3]-> 应排除属于部件 =123 和供应商名称 =ABC 的所有行。
Part=123,vendor name=XYZ,repair==1在第四位。所以检索第 4、5、6 和 7 行。
要考虑的条件是考虑 Position >3 和 Repair ==1 的行,检索所有后续行。
样本数据:
Input <- structure(list(`Part Number` = c(123, NA, NA, NA, NA, NA, 123,
NA, NA, NA, NA, NA, NA), `Vendor Name` = c("ABC", NA, NA, NA,
NA, NA, "XYZ", NA, NA, NA, NA, NA, NA), Position = c(1, 2, 3,
4, 5, 6, 1, 2, 3, 4, 5, 6, 7), Repair = c(2, 4, 1, 5, 6, 3, 4,
5, 7, 1, 2, 3, 6)), .Names = c("Part Number", "Vendor Name", "Position",
"Repair"), row.names = c(NA, -13L), class = c("tbl_df", "tbl",
"data.frame"))
我尝试了以下方法,但没有得到我想要的结果:
output_table <- Input %>% group_by(`Part Number`,`Vendor Name`) %>%
mutate(rn=row_number()) %>% filter(rn>=which(pivot$Repair==1)) #Here I'm able to filter subsequent rows where repair==1 but how to exclude the rows which doesn't fall under the mentioned conditions.
output_table <- Input[Input$Position >3 & Input$Repair==1,] # gives me rows matching the condition but I need subsequent rows once the condition is met
解决方案
您的格式似乎适用于数据处理的演示(报告)副。像这样的任何处理都应该在您执行诸如删除重复行以进行视觉分组之类的操作之前完成。
最终,您在这里唯一需要的部分group_by
是使用cumany
. 其余的变异代码是为了容纳这些NA
字段。
Input %>%
# assuming order is "safe to assume"
mutate_at(vars(`Part Number`, `Vendor Name`), zoo::na.locf) %>%
group_by(`Part Number`,`Vendor Name`) %>%
filter(cumany(Position > 3 & Repair == 1)) %>%
# return the first two columns to NA
mutate(toprow = row_number() == 1L) %>%
ungroup() %>%
mutate_at(vars(`Part Number`, `Vendor Name`), ~ if_else(toprow, ., .[NA])) %>%
select(-toprow)
# # A tibble: 4 x 4
# `Part Number` `Vendor Name` Position Repair
# <dbl> <chr> <dbl> <dbl>
# 1 123 XYZ 4 1
# 2 NA <NA> 5 2
# 3 NA <NA> 6 3
# 4 NA <NA> 7 6
如果您正在对数据进行更多处理,我建议您不要撤消“向下拖动标签”,而只需执行以下操作:
Input %>%
# assuming order is "safe to assume"
mutate_at(vars(`Part Number`, `Vendor Name`), zoo::na.locf) %>%
group_by(`Part Number`,`Vendor Name`) %>%
filter(cumany(Position > 3 & Repair == 1)) %>%
ungroup()
# # A tibble: 4 x 4
# `Part Number` `Vendor Name` Position Repair
# <dbl> <chr> <dbl> <dbl>
# 1 123 XYZ 4 1
# 2 123 XYZ 5 2
# 3 123 XYZ 6 3
# 4 123 XYZ 7 6
推荐阅读
- c# - 如何在 Blazor 页面中嵌入推文?
- android - 适配器在android中无法正常工作
- scala - Scala 机器模拟器
- ajax - 提交时在 Wordpress 中调用 AJAX
- postgresql - 如何正确创建查询以从 PostgreSQL 数据库中获取信息?
- fortran - 数组打印的格式描述符
- html - Bootstrap 中的订单视图
- java - 无法使用“jetty-maven-plugin”启动 Spring 应用程序:服务器停止而没有错误
- c++ - 这个 size_t 的语法是什么意思?
- javascript - 如何使用 sheetJS 和节点读取上传文件的工作表数据?