2
votes

Comment sélectionner la valeur la plus basse ou supprimer les doublons après avoir utilisé la fonction group_by dans r

J'ai regardé un certain nombre de fils et je ne trouve pas tout à fait ce que je recherche. J'ai un ensemble de données avec plusieurs identifiants et dates comme ci-dessous.

df %>%
 group_by(id, date) %>%
 arrange(code)

Je ne veux pas de dates en double par identifiant et je souhaite le sélectionner en fonction de la valeur de code la plus basse pour que cela se termine comme suit:

id  date       code
1   2000-10-08  35
1   2001-01-01  70
1   2008-09-05  5
2   2006-02-01  188
3   2010-10-10  25

J'ai utilisé la fonction group_by pour qu'elle traite les données par identifiant et date:

id  date       code
1   2000-10-08  690
1   2000-10-08  75
1   2000-10-08  35
1   2001-01-01  315
1   2001-01-01  70
1   2008-09-05  690
1   2008-09-05  5
1   2008-09-05  60
2   2006-02-01  188
2   2006-02-01  198
2   2006-02-01  555
2   2006-02-01  690
3   2010-10-10  120
3   2010-10-10  75
3   2010-10-10  25

Cependant, j'ai du mal à déterminer quel code utiliser pour pour ne conserver que la valeur la plus basse de chaque combinaison id / date.

Quelqu'un pourrait-il m'aider?

Merci


4 commentaires

utilisez min , cela fonctionne pour chaque groupe ...


De plus, vous aurez besoin de summary au lieu de arrange .


La question n'est pas une dupe de stackoverflow.com/questions/9723208/... parce que l'agrégation n'est qu'un moyen (peut-être pas le meilleur) de répondre à la question.


@Ista D'accord. Qu'en est-il de stackoverflow.com/questions/24070714/...


4 Réponses :


1
votes

data.table approche

dt <- fread("id  date       code
1   2000-10-08  690
1   2000-10-08  75
1   2000-10-08  35
1   2001-01-01  315
1   2001-01-01  70
1   2008-09-05  690
1   2008-09-05  5
1   2008-09-05  60
2   2006-02-01  188
2   2006-02-01  198
2   2006-02-01  555
2   2006-02-01  690
3   2010-10-10  120
3   2010-10-10  75
3   2010-10-10  25", header = TRUE)

exemple de données

library( data.table )
dt[, .( min = min( code ) ), by = .( id, date )]

#    id       date min
# 1:  1 2000-10-08  35
# 2:  1 2001-01-01  70
# 3:  1 2008-09-05   5
# 4:  2 2006-02-01 188
# 5:  3 2010-10-10  25


0 commentaires

1
votes

Avec tidyverse , vous pouvez faire:

library(tidyverse)
dt %>% 
    group_by(id, date) %>% 
    summarise(code = min(code))

  id       date   x
1  1 2000-10-08  35
2  1 2001-01-01  70
3  1 2008-09-05   5
4  2 2006-02-01 188
5  3 2010-10-10  25


0 commentaires

1
votes

Du point de vue tidyverse , s'il y a beaucoup de colonnes et que la ligne est nécessaire en fonction de la valeur imum min de 'code' pour chaque groupe, il peut être filtre avec une condition logique

df <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 3L, 3L, 3L), date = c("2000-10-08", "2000-10-08", "2000-10-08", 
"2001-01-01", "2001-01-01", "2008-09-05", "2008-09-05", "2008-09-05", 
"2006-02-01", "2006-02-01", "2006-02-01", "2006-02-01", "2010-10-10", 
 "2010-10-10", "2010-10-10"), code = c(690L, 75L, 35L, 315L, 70L,
 690L, 5L, 60L, 188L, 198L, 555L, 690L, 120L, 75L, 25L)), 
 class = "data.frame", row.names = c(NA, -15L))

S'il y a des liens pour la valeur min pour chaque groupe et que vous ne voulez que la première occurrence du min 'code'

aggregate(code ~ id + date, df, min)
#  id       date code
#1  1 2000-10-08   35
#2  1 2001-01-01   70
#3  2 2006-02-01  188
#4  1 2008-09-05    5
#5  3 2010-10-10   25

Ou une autre option utilise top_n

df %>%
   group_by(id, date) %>%
   top_n(1, -code)

Utilisation de l ' agrégat de la base R

df %>%
   group_by(id, date) %>%
   slice(which.min(code))

données

library(tidyverse)
df %>%
   group_by(id, date) %>%
   filter(code == min(code))
# A tibble: 5 x 3
# Groups:   id, date [5]
#     id date        code
#  <int> <chr>      <int>
#1     1 2000-10-08    35
#2     1 2001-01-01    70
#3     1 2008-09-05     5
#4     2 2006-02-01   188
#5     3 2010-10-10    25


0 commentaires

1
votes

Ajoutez simplement slice (1) à la fin de votre code:

df %>%
 group_by(id, date) %>%
    arrange(code) %>%
    slice(1)
## # A tibble: 5 x 3
## # Groups:   id, date [5]
##      id date        code
##   <int> <fct>      <int>
## 1     1 2000-10-08    35
## 2     1 2001-01-01    70
## 3     1 2008-09-05     5
## 4     2 2006-02-01   188
## 5     3 2010-10-10    25


0 commentaires