按组查找第二大元素

Find second largest element by group

在我的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。

我们可以试试

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

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

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