【发布时间】:2021-08-22 16:23:03
【问题描述】:
我无法根据优先级降序的条件选择行。我试过找出解决方案,但就是做不到。这似乎是一项简单的任务,但我就是想不通。
这只是我想做的一个一般示例。
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)
所以基本上我想从一个大样本中过滤出恰好有一个这种情况的组。即没有关系:
- 当 x =“是”并且
- 假设 x = "Yes" 选择具有 x = "Yes" 的最小 y 并且
- 从这个最后的最小组中选择具有最大值的 z。
- 假设 x = "Yes" 选择具有 x = "Yes" 的最小 y 并且
基本上也有可能不存在这样的最终值。
这是一个我经常遇到的问题的简化示例。我有一个更大的数据集,我需要根据多个优先级递减的条件为单元格分配值。我希望能够按顺序堆叠条件。
更新
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 打破。我希望如此。我就是无法让它工作。
【问题讨论】:
标签: r if-statement