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]]
4 Réponses :
Vous n'avez pas à fusionner. Vous pouvez simplement soustraire qui donne, p> Âge code> à partir de AGE_CHECK CODE> et maintenez la ligne avec la valeur minimale. La solution Tidyverse code> serait,
# 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
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]
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
devrait être auto-explicite:
ou en utilisant votre propre astuce: dat [dat [ .i [qui.min (ABS (ABS-AGE_CHECK))], par =. (ID)] $ v1] code>, qui devrait être plus rapide
À droite, finalement, les deux seront de vitesse similaire pour ce type d'expression.