首页 > 解决方案 > 过滤掉优先级递减的条件

问题描述

我无法根据优先级降序的条件选择行。我试过找出解决方案,但就是做不到。这似乎是一个简单的任务,但我就是想不通。

这只是我想做的一个一般例子。

structure(list(type = c(100815L, 100815L, 100815L, 100815L, 
100815L, 100815L, 100815L), x = structure(c(1L, 
1L, 1L, 2L, 1L, 2L, 2L), .Label = c("No", "Yes"), class = "factor"), 
    y = c(1.51098844290943, 2.31001922745969, 1.52639281812227, 
    0, 0, 0, 0), z = c(0, 0, 0, 25, 0, 50, 25)), row.names = c(NA, 
-7L), class = c("tbl_df", "tbl", "data.frame"))


group <- group %>%
  group_by(type) %>% 
     filter(sum(x == "Yes" &
                y == min(y[x == "Yes"]) &
                z == max(z[y == min(y[x == "Yes"])])) == 1)

所以基本上我想从一个大样本中过滤出恰好有一个这种情况的组。即没有关系:

基本上也有可能不存在这样的最终值。

这是我经常遇到的问题的简化示例。我有一个更大的数据集,我需要根据多个优先级递减的条件为单元格分配值。我希望能够按顺序堆叠条件。

更新

structure(list(type = c(7345L, 7345L, 7345L, 7345L, 7345L, 
7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 
7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L
), x= structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L
), .Label = c("No", "Yes"), class = "factor"), y = c(1.66703903751618, 
0, 0.899002060282742, 1.77844476717205, 0.858205995526113, 1.77844476717205, 
0.894654725714929, 2.28497216539696, 0, 0.899002060282742, 2.28497216539696, 
2.85895315127563, 2.85895315127563, 0, 2.85895315127563, 0.858205995526113, 
0.894654725714929, 1.66703903751618, 1.66703903751618, 0, 0, 
1.66703903751618, 0.894654725714929), z = c(6.67, 
0, 3.33, 6.67, 3.33, 6.67, 2, 6.67, 3.33, 3.33, 2, 3.33, 3.33, 
2, 3.33, 6.67, 6.67, 6.67, 2, 6.67, 3.33, 6.67, 2)), row.names = c(NA, 
-23L), class = c("tbl_df", "tbl", "data.frame"))

# And the code that I attempted:

test <- test %>%
          group_by(type) %>%
          arrange(type) %>%
          filter(sum(y == min(y)  & x == "Yes") == 1) %>%
          ungroup()

根据我的理解,这里的小组应该被过滤掉,但事实并非如此。有两个“是”,但另一个有一个较小的 y,应该只有一个规则发生的情况,但过滤器没有选择它。

这只是一个有两个条件的限制版本。基本上我试图给一个 x 分配一个“是”。如果有多个,则平局被 y 打破。如果还有平局,则平局被 z 打破。我希望如此。我只是无法让它工作。

标签: rif-statement

解决方案


我认为这就是你要找的:

df %>% group_by(type) %>% filter(x == "Yes",y == min(y),z == max(z))

# # A tibble: 1 × 4
# # Groups:   type [1]
#     type x         y     z
#    <int> <fct> <dbl> <dbl>
# 1 100815 Yes       0    50 

推荐阅读