【问题标题】:Find second largest element by group按组查找第二大元素
【发布时间】:2016-03-19 15:05:09
【问题描述】:

在我的 3 列数据集中,2 个是字符串,1 个是整数:

a<-read.table(text="X X.1 X.2
          A Z1  5
          B Z1  1
          C Z1  21
          E Z1  8
          F Z1  7
          G Z1  4
          H Z1  13
          I Z1  4
          J Z1  5
          A Z2  8
          B Z2  1
          D Z2  5
          E Z2  5
          F Z2  7
          G Z2  4
          H Z2  16
          I Z2  7
          J Z2  9
          A Z3  8
          B Z3  23
          C Z3  11
          D Z3  14
          E Z3  15
          ", header=TRUE)

我想按组查找数据集的最大值和第二大;这意味着我想通过其频率(X.2)来识别 X.1 中 X 的最大值和第二大值。对我有用的按组识别最大值的代码是:

a.agg <- aggregate(X.2 ~ X.1, a, max)
(df.max <- merge(a.agg, a))
#   X.1 X.2 X
# 1  Z1  21 C
# 2  Z2  16 H
# 3  Z3  23 B

现在,下一步是根据频率变量 X.2 按组 (X, X.1) 找到变量 X 的第二大出现值。 结果应该是 3 行(因为 X.1 有 3 个值)按 X.1 和从 X.2 列确定的第二大频率返回 X。

【问题讨论】:

    标签: r groupwise-maximum


    【解决方案1】:

    我们可以试试

    library(data.table)
    setDT(a)[order(-X.2),.SD[2], X.1]
    #   X.1 X X.2
    #1:  Z3 E  15
    #2:  Z1 H  13
    #3:  Z2 J   9
    

    【讨论】:

    • 对于这个问题,这是一个比接受的答案更快更好的答案,聚合(接受的答案)可能会比 data.table 慢
    【解决方案2】:

    您需要做的就是将max 替换为返回第二大值的函数:

    a.agg <- aggregate(X.2 ~ X.1, a, function(x) sort(x, decreasing=T)[2])
    (df.second <- merge(a.agg, a))
    #   X.1 X.2 X
    # 1  Z1  13 H
    # 2  Z2   9 J
    # 3  Z3  15 E
    

    【讨论】:

    • 优雅的解决方案@josilber!我现在找到一个类似的: a.second.max% group_by(X.1) %>% filter(rank(-X.2, ties.method="min")==2) 但我更喜欢你的!问候和感谢!帕特里克
    猜你喜欢
    • 1970-01-01
    • 2021-06-08
    • 2015-01-08
    • 2012-12-25
    • 2010-11-27
    • 2015-05-23
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多