R:有条件抑制多行值

问题描述 投票:0回答:1

这个问题与这个问题类似,但这种情况的不同之处在于按行抑制数据。 通过用 -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)

但这似乎不起作用。我将不胜感激任何帮助。

r if-statement dplyr purrr suppression
1个回答
0
投票

一个

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
© www.soinside.com 2019 - 2024. All rights reserved.