gpt4 book ai didi

r - 在 dplyr 中确定分组数据框中最频繁因素的最快方法

转载 作者:行者123 更新时间:2023-12-04 13:05:12 27 4
gpt4 key购买 nike

在汇总 dplyr 中的数据框时,我试图为多个因子变量找到一组中最频繁的值。我需要一个执行以下操作的公式:

  • 找出一组中一个变量的所有因子中最常用的因子水平(所以基本上是“max()”用于因子水平的计数)。
  • 如果几个最常用的因素水平之间存在联系,请选择这些因素水平中的任何一个。
  • 返回因子级别名称(不是计数数)。

  • 有几个有效的公式。但是,我能想到的都是慢的。那些快速的不方便一次应用于数据框中的多个变量。我想知道是否有人知道一种与 dplyr 很好地集成的快速方法。

    我尝试了以下方法:

    生成样本数据(50000 组,100 个随机字母)
    z <- data.frame(a = rep(1:50000,100), b = sample(LETTERS, 5000000, replace = TRUE))

    str(z)
    'data.frame': 5000000 obs. of 2 variables:
    $ a: int 1 2 3 4 5 6 7 8 9 10 ...
    $ b: Factor w/ 26 levels "A","B","C","D",..: 6 4 14 12 3 19 17 19 15 20 ...

    “干净”但缓慢的方法 1
     y <- z %>% 
    group_by(a) %>%
    summarise(c = names(table(b))[which.max(table(b))])

    user system elapsed
    26.772 2.011 29.568

    “干净”但缓慢的方法 2
    y <- z %>% 
    group_by(a) %>%
    summarise(c = names(which(table(b) == max(table(b)))[1]))

    user system elapsed
    29.329 2.029 32.361

    “干净”但缓慢的方法 3
    y <- z %>% 
    group_by(a) %>%
    summarise(c = names(sort(table(b),decreasing = TRUE)[1]))

    user system elapsed
    35.086 6.905 42.485

    “凌乱”但快速的方法
    y <- z %>% 
    group_by(a,b) %>%
    summarise(counter = n()) %>%
    group_by(a) %>%
    filter(counter == max(counter))
    y <- y[!duplicated(y$a),]
    y <- y$counter <- NULL

    user system elapsed
    7.061 0.330 7.664

    最佳答案

    这是 dplyr 的另一个选项:

    set.seed(123)
    z <- data.frame(a = rep(1:50000,100),
    b = sample(LETTERS, 5000000, replace = TRUE),
    stringsAsFactors = FALSE)

    a <- z %>% group_by(a, b) %>% summarise(c=n()) %>% filter(row_number(desc(c))==1) %>% .$b
    b <- z %>% group_by(a) %>% summarise(c=names(which(table(b) == max(table(b)))[1])) %>% .$c

    我们确保这些是等效的方法:
    > identical(a, b)
    #[1] TRUE

    更新

    正如@docendodiscimus 所提到的,你也可以这样做:
    count(z, a, b) %>% slice(which.max(n))

    以下是基准测试的结果:
    library(microbenchmark)
    mbm <- microbenchmark(
    steven = z %>% group_by(a, b) %>% summarise(c = n()) %>% filter(row_number(desc(c))==1),
    phil = z %>% group_by(a) %>% summarise(c = names(which(table(b) == max(table(b)))[1])),
    docendo = count(z, a, b) %>% slice(which.max(n)),
    times = 10
    )

    enter image description here
    #Unit: seconds
    # expr min lq mean median uq max neval cld
    # steven 4.752168 4.789564 4.815986 4.813686 4.847964 4.875109 10 b
    # phil 15.356051 15.378914 15.467534 15.458844 15.533385 15.606690 10 c
    # docendo 4.586096 4.611401 4.669375 4.688420 4.702352 4.753583 10 a

    关于r - 在 dplyr 中确定分组数据框中最频繁因素的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766325/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com