Search code examples
rdata.tableminimum

How can you get all the minimum values of a variable by group?


I have a data frame:

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))

I would like to get ALL the minimum valueS of var and their associated index for each values of P. I can do this:

DT <- data.table(df)
DT[  ,.SD[which.min(var)], by = P]

which gives only one minimum value of var (the first one) by P:

   P index  var
1: A  ind2   1
2: B  ind3   4
3: C  ind1   2

And I would like:

   P index  var
1: A  ind2   1
2: A  ind3   1
2: B  ind3   4
3: C  ind1   2

Ideas?


Solution

  • From the help page for which.min, you'll note that it says:

    Determines the location, i.e., index of the (first) minimum or maximum of a numeric (or logical) vector.

    If you wanted all values that match the minimum, you should try using ==. Thus, continuing with your approach, try:

    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