这个问题与这个问题类似,但这种情况的不同之处在于按行抑制数据。 通过用 -1 替换每行中小于 6 的任何值来在每一行中完成抑制,这样如果在一行中只有一个抑制值,我也想抑制该行中的下一个更高的值,即使该值大于 5。在没有值大于 6 的情况下,这些值保持不变。我更喜欢 dplyr 中的解决方案,因为我正在使用数据框。
我的虚拟数据是:
df <- data.frame(list(w = c(7, 25, 9, 50), x = c(1, 25, 9, 50), y = c(6, 35, 1, 6), z = c(4,50, 1, 1)))
预期输出是:
w x y z
1 7 -1 6 -1
2 25 25 35 50
3 9 9 -1 -1
4 50 50 -1 -1
这是我的尝试:
df |>
pivot_longer(cols = everything(),
names_to = 'col',
values_to = 'val') |>
group_by(col) |>
group_map(~.x) |>
map(\ (x)
if(sum(x$val < 6) == 1){
x |>
mutate(val = replace(val, val %in% sort(unique(val), partial = 2)[1:2], -1))
}else{
x |>
mutate(val = replace(val, val < 6, -1))
}) |>
list_rbind(names_to = "col") |>
pivot_wider(names_from = col,
values_from = val)
但这似乎不起作用。我将不胜感激任何帮助。
一个
tidyverse
选项可以是:
df %>%
mutate(pmap_dfr(across(everything()),
~ ifelse((c(...) < 6) | (sum(c(...) < 6) == 1 & dense_rank(c(...)) <= 2),
-1,
c(...))))
w x y z
1 7 -1 6 -1
2 25 25 35 50
3 9 9 -1 -1
4 50 50 -1 -1