R 如何按组获取变量的所有最小值?

R 如何按组获取变量的所有最小值?,r,data.table,minimum,R,Data.table,Minimum,我有一个数据框: df<-data.frame(P = c("A","A","A", "B","B","B", "C", "C", "C"), index = c("ind1","ind2","ind3","ind1","ind2","ind3","ind1","ind2","ind3"), var = c(2,1,1,8,5,4,2,8,6)) 通过p,仅给出一个var的最小值(第一个): 我想: 想法?从which.min

我有一个数据框:

df<-data.frame(P = c("A","A","A", "B","B","B", "C", "C", "C"), 
               index = c("ind1","ind2","ind3","ind1","ind2","ind3","ind1","ind2","ind3"),
               var = c(2,1,1,8,5,4,2,8,6))
通过
p
,仅给出一个
var的最小值(第一个):

我想:


想法?

which.min
的帮助页面,您会注意到它说:

确定位置,即数字(或逻辑)向量的(第一个)最小值或最大值的索引

如果希望所有值都与最小值匹配,则应尝试使用
=
。因此,继续您的方法,尝试:

DT[, .SD[var == min(var)], by = P]
##    P index var
## 1: A  ind2   1
## 2: A  ind3   1
## 3: B  ind3   4
## 4: C  ind1   2

使用dplyr,可以使用以下选项之一:

library(dplyr)
DT %>% group_by(P) %>% filter(var == min(var))  # or %in% instead of ==
#Source: local data table [4 x 3]
#Groups: P
#
#       P  index   var
#  (fctr) (fctr) (dbl)
#1      A   ind2     1
#2      A   ind3     1
#3      B   ind3     4
#4      C   ind1     2


根据我的理解,您需要索引和P的每个唯一配对的最小值。。。然而,您想要的输出如何有两个P=='A'的观察值?然而,同时,根据同样的规则,对于P值“B”和“C”,你只有唯一的观察值。这应该会有所帮助
   P index  var
1: A  ind2   1
2: A  ind3   1
2: B  ind3   4
3: C  ind1   2
DT[, .SD[var == min(var)], by = P]
##    P index var
## 1: A  ind2   1
## 2: A  ind3   1
## 3: B  ind3   4
## 4: C  ind1   2
library(dplyr)
DT %>% group_by(P) %>% filter(var == min(var))  # or %in% instead of ==
#Source: local data table [4 x 3]
#Groups: P
#
#       P  index   var
#  (fctr) (fctr) (dbl)
#1      A   ind2     1
#2      A   ind3     1
#3      B   ind3     4
#4      C   ind1     2
DT %>% group_by(P) %>% top_n(1, desc(var)) # top_n() returns multiple rows in case of ties
#Source: local data table [4 x 3]
#Groups: P
#
#       P  index   var
#  (fctr) (fctr) (dbl)
#1      A   ind2     1
#2      A   ind3     1
#3      B   ind3     4
#4      C   ind1     2
DT %>% group_by(P) %>% filter(min_rank(var) == 1)
#Source: local data table [4 x 3]
#Groups: P
#
#       P  index   var
#  (fctr) (fctr) (dbl)
#1      A   ind2     1
#2      A   ind3     1
#3      B   ind3     4
#4      C   ind1     2