Je dois faire quelque chose de similaire à ci-dessous sur un très grand ensemble de données (avec beaucoup de groupes), et lire quelque part que l'utilisation de .SD est lente. Y a-t-il un moyen plus rapide d'effectuer l'opération suivante? Pour être plus précis, j'ai besoin de créer une nouvelle colonne qui contient la valeur min pour chaque groupe après avoir exclu un sous-ensemble d'observations dans ce groupe (quelque chose de similaire à minif dans Excel).Façon rapide de trouver min dans les groupes après exclusion des observations en utilisant R
library(data.table)
dt <- data.table(valid = c(0,1,1,0,1),
a = c(1,1,2,3,4),
groups = c("A", "A", "A", "B", "B"))
dt[, valid_min := .SD[valid == 1, min(a, na.rm = TRUE)], by = groups]
Avec la sortie:
> test
valid a k valid_min
1: 0 1 A 1
2: 1 1 A 1
3: 1 2 A 1
4: 0 3 B 4
5: 1 4 B 4
Pour les groupes pourraient avoir encore plus compliquée faire, pas d'entrées valides ou ils pourraient avoir plusieurs entrées valides mais manquantes. Mon code actuel est semblable à ceci:
dt <- data.table(valid = c(0,1,1,0,1,0,1,1),
a = c(1,1,2,3,4,3,NA,NA),
k = c("A", "A", "A", "B", "B", "C", "D", "D"))
dt[, valid_min := .SD[valid == 1,
ifelse(all(is.na(a)), NA_real_, min(a, na.rm = TRUE))], by = k]
Sortie:
> dt
valid a k valid_min
1: 0 1 A 1
2: 1 1 A 1
3: 1 2 A 1
4: 0 3 B 4
5: 1 4 B 4
6: 0 3 C NA
7: 1 NA D NA
8: 1 NA D NA
Merci! Ceci est exactement ce que je cherchais :) – adamski