R:根据数据框中的条件折叠行并更改值

R: collapse rows and change value according to condition in data frame

我有一个数据集:

structure(list(num = c(12L, 12L), code = structure(1:2, .Label = c("a", "b"), class = "factor"), ranking = c(2414.5, 2414.5), bottom = c(-0.0153795976572657, -0.00651997615327495), previous = c(0.00121016455715892, -0.000166609624290187), of_all_previous = c(-0.000570973882726524, -0.000771377162183913)), row.names = c(NA, -2L), class = "data.frame")

我想根据 numranking 折叠两行,因为它们相同,但根据两行的列值 code 的条件更改 code =15=]、previousof_all_previous 应该按顺序进行比较(意思是:如果它们相等,则转到下一列,如 bottom -> previous - > of_all_previous) 并选择具有较高值的​​ code

在提供的示例数据的情况下,code b 因为 -0.0065199761532749503 > -0.0153795976572656777bottom 列中。

如果它们相等,则必须查看 previous 列。

我认为也许 dplyr 可以使用 %>% 折叠行,但我找不到如何根据条件同时更改行。

我希望输出看起来像这样:

            num   code ranking 
1            12    a  2414      

提前致谢。

也许,我们可以转向 'long' 格式和 slice

library(dplyr)
library(tidyr)
df1 %>%
   pivot_longer(cols = bottom:of_all_previous) %>%
  group_by(num, ranking, name) %>%
  slice(which.max(value)) %>% 
  ungroup %>% 
  slice(1)
# A tibble: 1 x 5
#    num code  ranking name      value
#  <int> <fct>   <dbl> <chr>     <dbl>
#1    12 b       2414. bottom -0.00652

一种方法可能是 group_by numranking 以查看具有相同值且需要折叠的行。

然后,将arrange(排序)进行比较的列降序排列,包括bottompreviousof_all_previous。完成此操作后,排序数据中较高的行将考虑列,以便在有联系时进行比较。

最后,您可以根据排序创建一个final_codefirst(code)

library(tidyverse)

df %>%
  group_by(num, ranking) %>%
  arrange(-bottom, -previous, -of_all_previous) %>%
  mutate(final_code = ifelse(n() > 1, as.character(first(code)), as.character(code))) %>%
  slice(1) %>%
  select(num, code, ranking)