[R] Getting minimum value of a column according a factor column of a dataframe

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Thu Aug 25 09:22:04 CEST 2022


Hello,

OK, what about


res <- lapply(split(df1, df1$Code), \(x) x[which.min(x$Q),])
do.call(rbind, res)
#         Code  Y  M  D     Q    N    O
#  41003 41003 81  1 19 0.160 7.17 2.50
#  41005 41005 79  8 17 0.210 5.50 7.20
#  41009 41009 79  2 21 0.218 5.56 4.04
#  41017 41017 79 10 20 0.240 5.30 7.10


A dplyr solution.



suppressPackageStartupMessages(library(dplyr))

df1 %>%
   group_by(Code) %>%
   slice_min(Q) %>%
   slice_head(n = 1)
#  # A tibble: 4 × 7
#  # Groups:   Code [4]
#    Code      Y     M     D     Q     N     O
#    <fct> <int> <int> <int> <dbl> <dbl> <dbl>
#  1 41003    81     1    19 0.16   7.17  2.5
#  2 41005    79     8    17 0.21   5.5   7.2
#  3 41009    79     2    21 0.218  5.56  4.04
#  4 41017    79    10    20 0.24   5.3   7.1



Hope this helps,

Rui Barradas


Às 05:56 de 25/08/2022, javad bayat escreveu:
> Dear all,
> Many thanks for your suggested methods and codes, but unfortunately they
> did not give the desired results.
> All the codes you have provided are correct but they did not represent the
> whole row which is related to the minimum of "Q".
> The code must result in 4 rows, with the minimum value of "Q" and other
> column values, as below:
> 
>         Code
> 
>                Y
> 
>                M
> 
>                 D
> 
>             Q
> 
>              N
> 
>               O
> 
> 41003
> 
> 81
> 
> 1
> 
> 19
> 
> 0.16
> 
> 7.17
> 
> 2.5
> 
> 41005
> 
> 79
> 
> 8
> 
> 17
> 
> 0.21
> 
> 5.5
> 
> 7.2
> 
> 41009
> 
> 79
> 
> 2
> 
> 21
> 
> 0.218
> 
> 5.56
> 
> 4.04
> 41017 79 10 20 0.24 5.3 7.1
> 
> 
> 
> 
> 
> 
> Sincerely
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 41017 79 10 20 0.24 5.3 7.1
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> On Wed, Aug 24, 2022 at 9:24 PM Rui Barradas <ruipbarradas using sapo.pt> wrote:
> 
>> Hello,
>>
>> Here are two options, the 1st outputs a vector, the 2nd a data.frame.
>>
>>
>> x<-'41003 81 1 19 0.16 7.17 2.5
>> 41003 77 9 22 0.197 6.8 2.2
>> 41003 79 7 28 0.21 4.7 6.2
>> 41005 79 8 17 0.21 5.5 7.2
>> 41005 80 10 30 0.21 6.84 2.6
>> 41005 80 12 20 0.21 6.84 2.4
>> 41005 79 6 14 0.217 5.61 3.55
>> 41009 79 2 21 0.218 5.56 4.04
>> 41009 79 5 27 0.218 6.4 3.12
>> 41009 80 11 29 0.22 6.84 2.8
>> 41009 78 5 28 0.232 6 3.2
>> 41009 81 8 20 0.233 6.39 1.6
>> 41009 79 9 30 0.24 5.6 7.5
>> 41017 79 10 20 0.24 5.3 7.1
>> 41017 80 7 30 0.24 6.73 2.6'
>> df1 <- read.table(textConnection(x))
>> names(df1) <- scan(what = character(),
>>                      text = 'Code Y M D Q N O')
>> df1$Code <- factor(df1$Code)
>>
>> # 1st option
>> with(df1, tapply(Q, Code, min))
>> #  41003 41005 41009 41017
>> #  0.160 0.210 0.218 0.240
>>
>> # 2nd option
>> aggregate(Q ~ Code, df1, min)
>> #     Code     Q
>> #  1 41003 0.160
>> #  2 41005 0.210
>> #  3 41009 0.218
>> #  4 41017 0.240
>>
>>
>> Hope this helps,
>>
>> Rui Barradas
>>
>> Às 08:44 de 24/08/2022, javad bayat escreveu:
>>> Dear all;
>>> I am trying to get the minimum value of a column based on a factor column
>>> of the same data frame. My data frame is like the below:
>>>          Code               Y               M                D
>>>    Q
>>>        N              O
>>> 41003 81 1 19 0.16 7.17 2.5
>>> 41003 77 9 22 0.197 6.8 2.2
>>> 41003 79 7 28 0.21 4.7 6.2
>>> 41005 79 8 17 0.21 5.5 7.2
>>> 41005 80 10 30 0.21 6.84 2.6
>>> 41005 80 12 20 0.21 6.84 2.4
>>> 41005 79 6 14 0.217 5.61 3.55
>>> 41009 79 2 21 0.218 5.56 4.04
>>> 41009 79 5 27 0.218 6.4 3.12
>>> 41009 80 11 29 0.22 6.84 2.8
>>> 41009 78 5 28 0.232 6 3.2
>>> 41009 81 8 20 0.233 6.39 1.6
>>> 41009 79 9 30 0.24 5.6 7.5
>>> 41017 79 10 20 0.24 5.3 7.1
>>> 41017 80 7 30 0.24 6.73 2.6
>>>
>>> I want to get the minimum value of the "Q" column with the whole row
>>> values, according to the "Code"  column  which is a factor. Overall it
>> will
>>> give me 4 rows, with the value of "Q". Below is a code that I used but it
>>> did not give me what I wanted.
>>>
>>>> x[which(x$Q == min(x$Q)),]
>>>
>>> Sincerely
>>>
>>>
>>>
>>
> 
>



More information about the R-help mailing list