r - 根据一列中的最大值和唯一值过滤行

标签 r dplyr tidyverse

Expected output解释起来有点棘手,我会尽力而为,在下面查询。我有一个 df 如下。我需要根据国家/地区列中的最大流行率按组过滤行,但在上述组中尚未发生。 (根据输出(图片),A 没有出现在 group2 中的原因是因为它已经出现在了 Group 1 中)
简而言之,我需要在 country 列中获得唯一值,同时在 pop 中获得最大值(在组级别上)。我希望图片可以传达我无法传达的内容。 (首选 Tidyverse 解决方案)
[![预期输出][2]][2]

df<- structure(list(Group = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), country = c("A", "B", "C", "A", "E", "F", "A", "E", "G"), pop = c(200L, 100L, 50L, 200L, 150L, 120L, 200L, 150L, 
100L)), class = "data.frame", row.names = c(NA, -9L))

最佳答案

我认为这会做。语法说明

  • 将数据拆分为每个组的列表
  • 离开第一组(因为它将在下一步中用作 .init,但在过滤了 pop 值的最大值后。
  • 使用 purrr::reduce这里将把小标题列表减少到一个小标题
  • reduce 中使用的迭代
  • .init用作过滤的第一组
  • 此后通过 anti_join 删除先前组中的国家/地区
  • 此数据过滤为最大值 pop再次
  • 通过 bind_rows() 添加先前过滤的国家/地区

  • 因此,最终我们将获得所需的 tibble。
  • df %>% group_split(Group) %>% .[-1] %>%
      reduce(.init =df %>% group_split(Group) %>% .[[1]] %>% 
                   filter(pop == max(pop)), 
                 ~ .y  %>%
                   anti_join(.x, by = c("country" = "country")) %>% 
                   filter(pop == max(pop)) %>%
                   bind_rows(.x) %>% arrange(Group)) 
    
    # A tibble: 3 x 3
      Group country   pop
      <int> <chr>   <int>
    1     1 A         200
    2     2 E         150
    3     3 G         100
    

    关于r - 根据一列中的最大值和唯一值过滤行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67043336/

    相关文章:

    javascript - 如何在 Shiny 中创建一个弹出窗口来警告用户选择一种类型的文件扩展名?

    删除 R 中数据框中所有列名的前两个字符

    r - 安全地通过函数 purrr 并保存出现错误的链接

    r - 为什么 dplyr 在数据聚合方面比 plyr 慢?

    r - 根据引用日期时间过滤、分类和创建新变量

    r - 在 dplyr::mutate 中使用 strsplit (没有 tibble::data_frame)会引发 "Evaluation error: non-character argument"

    r - 基于两列修改R数据框

    r - 在 R 中将全名与倒序匹配

    r - R tidyverse 中根据另一个数据帧中的范围匹配一个数据帧

    r - 使用facet_wrap()时在ggplot中手动标记轴