R 按组查找第二大元素

R 按组查找第二大元素,r,groupwise-maximum,R,Groupwise Maximum,在我的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

在我的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)
a我们可以试试

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
我们可以试试

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
替换为返回第二大值的函数:

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

a.agg您只需将
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

a.agg Elagant solution@josilber!我现在发现了一个简单的例子:a.second.max%groupby(X.1)%>%filter(秩(-X.2,ties.method=“min”)==2),但我更喜欢urs!问候和感谢!Patricklagant solution@josilber!我现在发现了一个简单的例子:a.second.max%groupby(X.1)%>%filter(秩(-X.2,ties.method=“min”)==2),但我更喜欢urs!问候和感谢!Patrik这是一个比公认答案更快更好的回答,聚合(公认答案)可能比数据慢。表这是一个比公认答案更快更好的回答,聚合(公认答案)可能比数据慢。表