【问题标题】:grouping of data frame based on condition and return entire grouped data frame根据条件对数据框进行分组并返回整个分组的数据框
【发布时间】:2015-12-29 08:33:16
【问题描述】:

假设我有以下数据框。第一列是 INPUT,其值为 4000,4000,3000,2000,2000,2000,2000 等。第二列是组,其值为 - 1,1,2,3,3,3,3 . 分组已根据 INPUT 完成。 例如:输入是:-

INPUT     group
4000       1
4000       1
2000       2
3000       3
2000       4
2000       4
2000       4

输出:- 返回具有最大重复组值的整个 data.frame。

INPUT     group
2000        4
2000        4
2000        4

我的数据框有 10,0000 条记录和 70 个属性。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用data.table。我们将 'data.frame' 转换为 'data.table' (setDT(df1),获取按 'group' 分组的 nrow 并将具有 max 值的行子集在 'N' 中。

    library(data.table)
    setDT(df1)[, N:= .N, group][N==max(N)][, N:= NULL]
    #    INPUT group
    #1:  2000     4
    #2:  2000     4
    #3:  2000     4
    

    【讨论】:

    • 这将只返回一行我需要所有记录。
    • 你能告诉我如何遍历所有组,所以它会返回结果,如第一组最大值,然后是第二个数据帧,然后是第三个等等......
    • 你可以试试setDT(df1)[, N:=.N, group][order(group, -N)]按顺序获取数据集
    【解决方案2】:

    您可以尝试使用table 函数,然后使用which.max 找到最大重复值

    df[df$group == which.max(table(df$group)), ]
    
    #   INPUT group
    #5  2000     4
    #6  2000     4
    #7  2000     4
    

    根据@David 的评论,这里使用tabulate 而不是table 会很有帮助,因为它是一个大型数据集

    df[df$group == which.max(tabulate(df$group)), ]
    

    只是对这个数据集本身做了一个小比较

    library(microbenchmark)
    microbenchmark(
    tabulate = df[df$group == which.max(tabulate(df$group)), ],
    table = df[df$group == which.max(table(df$group)), ]
    )
    
    # Unit: microseconds
    # expr       min       lq      mean    median       uq     max   neval
    # tabulate  46.871  51.1475  56.94295  53.714  62.4375  92.715    100
    # table     184.747 192.4440 211.37036 203.905 216.3925 455.023   100
    

    【讨论】:

    • tabulate 在这种情况下可能会更好。
    • @DavidArenburg 不完全确定如何使用它。只需将 table 替换为 tabulate 即可得到相同的结果,但我认为这不是它的使用方式。
    • @DavidArenburg 谢谢大卫。更新了解决方案。
    【解决方案3】:

    您也可以使用基础 R。 首先计算由 INPUT 变量分层的每个组变量的计数

    d$count <- ave(d$INPUT, d$group,  FUN = length)
    

    返回具有最大重复组值的数据。

    d[ d$count == max(d$count),  ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 2019-10-27
      • 2016-09-14
      相关资源
      最近更新 更多