首页 > 解决方案 > 从两个不同的列满足条件时检索后续行

问题描述

我有一个数据框,其中包含如下所示的数据:

  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

标签: r

解决方案


您的格式似乎适用于数据处理的演示(报告)副。像这样的任何处理都应该在您执行诸如删除重复行以进行视觉分组之类的操作之前完成。

最终,您在这里唯一需要的部分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

推荐阅读