【问题标题】:Mark top entries of subsets in R with tidyverse用 tidyverse 标记 R 中子集的顶部条目
【发布时间】:2019-09-21 02:36:54
【问题描述】:

我想用 tidyverse 标记我的第一个排名靠前的值 - 如果可能的话。

假设以下数据

test = tibble(group=c(1,1,1,1,2,2,2,2), values = c(1,2,3,4,7,6,5,2))

我现在想标记第一个最高值,即第 1 组的值 3 和 4,第 2 组的值 7 和 6,产生:

# A tibble: 8 x 3
  group values marker
  <dbl>  <dbl> <lgl> 
1     1      1 FALSE 
2     1      2 FALSE 
3     1      3 TRUE
4     1      4 TRUE 
5     2      7 TRUE 
6     2      6 TRUE 
7     2      5 FALSE 
8     2      2 FALSE 

我考虑过对它们进行排名,而不是进行比较以获得布尔值或使用 purrr,但我不知道如何。

【问题讨论】:

    标签: r tidyr purrr


    【解决方案1】:

    按“组”分组后,rank“值”检查sorted 'n'tail 元素是%in% ranked 元素以创建逻辑vector

    library(tidyverse)
    test %>% 
      group_by(group) %>% 
      mutate(marker = dense_rank(values), 
              marker = marker %in% tail(sort(marker), 2))
    

    或者在tail上直接使用order%in%

    test %>% 
      group_by(group) %>% 
      mutate(marker = values %in% tail(values[order(values)], 2))
    

    或者

    test %>%
       group_by(group) %>%
       mutate(marker = dense_rank(values) > n()-2)
    

    或者可以用data.table在一行中完成

    library(data.table)
    setDT(test)[order(values), marker := values %in% tail(values, 2), group]
    

    或者另一种选择是在按“组”分组后,在创建“标记”后使用原始数据集获取top_n 行(n - 指定为 2,wt 为“值”),right_join ' 列的 'TRUE',然后是 replace NA 元素和 FALSE

    test %>%
       group_by(group) %>% 
       top_n(2, values) %>%
       mutate(marker = TRUE) %>%
       right_join(test) %>%
       mutate(marker = replace_na(marker, FALSE))
    

    【讨论】:

    • 嗯,top_n 函数看起来对以后的使用很有帮助,但是没有加入的版本看起来更好。
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多