0
votes

Exclure la ligne dupliquée pour laquelle deux variables ne sont pas les plus proches les unes des autres

J'ai dupliquer les identifiants de patient pour lesquels les lignes sont identiques à une autre variable (âge). Cependant, il existe également une variable de vérification de l'âge qui illustre quelle ligne est susceptible d'être correcte. La rangée pour laquelle l'âge est le plus proche de la «vérification de l'âge» est la ligne que je voudrais garder. Donc, pour id = 3, la valeur 31 est plus proche de 30 28. Par conséquent, je voudrais supprimer la ligne Contaiing Age_Check == 28. Je voudrais utiliser des données.Table dans R.

res <-  unique(dat[, .(id)])
res[, w := dat[c(.SD, age = age_check), on =.(id, age), roll= "nearest",   which=TRUE]]


0 commentaires

4 Réponses :


0
votes

Vous n'avez pas à fusionner. Vous pouvez simplement soustraire Âge code> à partir de AGE_CHECK CODE> et maintenez la ligne avec la valeur minimale. La solution Tidyverse code> serait, xxx pré>

qui donne, p>

# A tibble: 5 x 3
# Groups:   id [5]
     id   age age_check
  <dbl> <dbl>     <dbl>
1     1    20        20
2     2    20        20
3     3    30        31
4     4    35        35
5     5    40        40


0 commentaires

0
votes

Vous pouvez faire ce qui suit (à condition que pour toutes les lignes non dupliquées, l'AGE_CHECK est égal à l'âge):

dat[, dup_id := duplicated(id) | duplicated(id, fromLast = T)] #find duplicates
dat[, min_dist := abs(age-age_check) == min(abs(age-age_check)), by = id]
dat <- dat[dup_id == F | min_dist == T][, c("dup_id", "min_dist") := NULL]


0 commentaires

0
votes

Utilisation de Tairyverse code>, s'il n'y aura pas dupliquer les valeurs les plus proches les plus proches (comme filtre () code> retourne toutes les lignes avec la valeur donnée), vous pouvez utiliser:

do.call(rbind, by(dat, dat$id, function(x) x[which.min(abs(x$age-x$age_check)), ]))

   id age age_check
1:  1  20        20
2:  2  20        20
3:  3  30        31
4:  4  35        35
5:  5  40        40


0 commentaires

1
votes

devrait être auto-explicite: xxx


2 commentaires

ou en utilisant votre propre astuce: dat [dat [ .i [qui.min (ABS (ABS-AGE_CHECK))], par =. (ID)] $ v1] , qui devrait être plus rapide


À droite, finalement, les deux seront de vitesse similaire pour ce type d'expression.