首页 > 解决方案 > 分组并保留在不同列中具有最大值的整行

问题描述

我有一个看起来像的df:

# Groups:   telefono1 [360]
   nombre telefono1 telefono2 ads_ao ads_am ads_mas ads_ma total_price_ao total_price_am total_price_mas~ total_price_ma
   <chr>  <chr>     <lgl>     <chr>   <dbl> <chr>      <chr>  <chr>                   <dbl> <chr>            <chr>         
 1 CRIST~ 60***0400 NA        0           0 0          0      0                           0 0                0             
 2 CRIST~ 60***0400 NA        0          61 0          0      0                           0 0                0             
 3 CRIST~ 60***0400 NA        0           0 0          0      0                           0 0                0             
 4 DIEGO~ 60***0844 NA        0           0 0          0      0                           0 0                0             
 5 Diego  60***0844 FALSE     0           0 0          2      0                           0 0                22500         
 6 TALLE~ 60***4848 NA        2           0 0          0      59000                       0 0                0             
 7 TALLE~ 60***4848 NA        0         311 0          0      0                           0 0                0             
 8 Rub?n  60***4848 FALSE     0           0 0          2      0                           0 0                59000

我需要按 Telefono1 分组,然后保留整行,其中跨列“ads_ao、ads、am、ads_mas 和 ads_ma”的值为最大值。

在示例中,正确的解决方案是行#2、#5 和#7,因为它们是按telefono1 分组的行,它们在提到的列中具有最大值。

我用 dplyr 试过了

  group_by(telefono1) %>%
  mutate(max_value = max(ads_ao, ads_am, ads_mas, ads_ma)) %>%
  ungroup()

但是通过这种方法,我在所有行中都得到了一个具有最大值的新变量,然后我不能使用 top_n() 来获取具有最大值的行,因为所有行都是相等的。

请问有人知道有什么解决办法吗?谢谢!!

标签: rdplyrgroup-by

解决方案


一个dplyr选项purrr可能是:

df %>%
 group_by(telefono1) %>%
 slice_max(pmap_dbl(across(starts_with("ads")), max), 1)

  nombre telefono1 telefono2 ads_ao ads_am ads_mas ads_ma total_price_ao total_price_am total_price_mas. total_price_ma
  <chr>      <int> <lgl>      <int>  <int>   <int>  <int>          <int>          <int>            <int>          <int>
1 CRIST~ 600040400 NA             0     61       0      0              0              0                0              0
2 Diego  600530844 FALSE          0      0       0      2              0              0                0          22500
3 TALLE~ 600674848 NA             0    311       0      0              0              0                0              0

推荐阅读