Bonjour,
Plusieurs commentaires/remarques et propositions:
a/ Attention, inclure le code "rm(list=ls())" ne garantit pas que l'a session R est réinitialiser, c.-à-d., les packages sont toujours chargés.
Ainsi, il est préférable de démarrer une nouvelle session de R (au passage, il est préférable de désactiver les options de sauvegarde/chargements des sessions de travail)
b/ Quelques espaces et un peu moins d'affectation, permettrait de limiter le nombre d'objet dans votre session R et augmenterait du même coup la lisibilité et l'interprétation du code
Code : Tout sélectionner
ADCP <- data.frame(
distance = c(0, 2.5, 3.5, 4.5, 5.5, 6.5),
x1 = c(1, 4, 3, 6, 1, 4),
x2 = c(11, 42, 35, 61, 11, 44),
x3 = c(51, 62, 5, 1, 8, NA),
x4 = c(41, 52, 63, 14, 74, 43),
x5 = c(NA, 47, 6, 4, 7, 47)
)
samp <- rbind.data.frame(
c(2, 4, 0, 2.5),
c(4, 5, 2.5, 7),
c(5, 6.2, 7, 9.6)
)
colnames(samp) <- c("xmin", "xmax", "ymin", "ymax")
c/ De mon interprétation/lecture, le vecteur "profondeur" n'a rien à faire dans la table ADCP, puisqu'elle semble être associé aux colonnes.
La nature/source des valeurs devient ici hétérogène, complexifiant leur utilisation. Comme la profondeur "0" ne semble pas existé, je ne réaffecte des noms de colonnes qu'avec les autres profondeurs.
d/ Maintenant, que les données sont stockés de façon homogène dans des objets, passons au formatage. Ici, vous souhaitez, effectuer des comparaisons de coordonnées impliquant la "distance" et la "profondeur", or nous avons ici un objet au format matrice (format "wide"), ce qui ne nous aide pas beaucoup.
Si nous avions, une colonne "distance" et une colonne "profondeur" pour chaque valeur, ce serait plus simple, non?
Code : Tout sélectionner
ADCP_longformat <- tidyr::gather(data = ADCP, key = "depth", value = "value", -distance)
e/ Ici, j'avais transformé les profondeurs en chaînes de caractère (noms de colonnes), repassons dans un format numérique
Code : Tout sélectionner
ADCP_longformat[, "depth"] <- as.numeric(gsub("P", "", ADCP_longformat[, "depth"]))
f/ Lors de l'utilisation d'une boucle "for", il est important de définir la taille de l'objet en amont de la boucle, pour des questions de performances et de mémoire. Ici, vous savez que votre objet contiendra un nombre d'éléments égal au nombre de ligne de "samp", précisons le et nommons ces éléments:
Code : Tout sélectionner
samp[, "subset_names"] <- paste0("S", 1:nrow(samp))
out <- rep(NA, nrow(samp))
names(out) <- samp[, "subset_names"]
g/ Votre condition est assez longue et vous n'avez probablement pas vu que les éléments de celle-ci n'était pas de même format/nature...
Reprenez votre code et testez les lignes suivantes de façon indépendantes:
Code : Tout sélectionner
ADCP$distance > samp$xmin[i]
ADCP$distance < samp$xmax[i]
ADCP[1,] > samp$ymin[i]
ADCP[1,] < samp$ymax[i]
Simplifions un peu tout cela, en découpant la condition en deux, sur les x et sur les y:
Code : Tout sélectionner
within_xrange <- ADCP_longformat[, "distance"] > samp[i, "xmin"] & ADCP_longformat[, "distance"] < samp[i, "xmax"]
within_yrange <- ADCP_longformat[, "depth"] > samp[i, "ymin"] & ADCP_longformat[, "depth"] < samp[i, "ymax"]
h/ Vérifions le sous groupe:
Code : Tout sélectionner
i = 1
within_xrange <- ADCP_longformat[, "distance"] > samp[i, "xmin"] & ADCP_longformat[, "distance"] < samp[i, "xmax"]
within_yrange <- ADCP_longformat[, "depth"] > samp[i, "ymin"] & ADCP_longformat[, "depth"] < samp[i, "ymax"]
ech <- ADCP_longformat[which(within_xrange & within_yrange), ]
i/ Finalisons le code en utilisant l'ensemble:
Code : Tout sélectionner
ADCP <- data.frame(
distance = c(0, 2.5, 3.5, 4.5, 5.5, 6.5),
x1 = c(1, 4, 3, 6, 1, 4),
x2 = c(11, 42, 35, 61, 11, 44),
x3 = c(51, 62, 5, 1, 8, NA),
x4 = c(41, 52, 63, 14, 74, 43),
x5 = c(NA, 47, 6, 4, 7, 47)
)
colnames(ADCP)[-1] <- sprintf("P%02d", c(2, 4, 6, 8, 10))
samp <- rbind.data.frame(
c(2, 4, 0, 2.5),
c(4, 5, 2.5, 7),
c(5, 6.2, 7, 9.6)
)
colnames(samp) <- c("xmin", "xmax", "ymin", "ymax")
ADCP_longformat <- tidyr::gather(data = ADCP, key = "depth", value = "value", -distance)
ADCP_longformat[, "depth"] <- as.numeric(gsub("P", "", ADCP_longformat[, "depth"]))
samp[, "subset_names"] <- paste0("S", 1:nrow(samp))
out <- rep(NA, nrow(samp))
names(out) <- samp[, "subset_names"]
for (i in 1:nrow(samp)){
within_xrange <- ADCP_longformat[, "distance"] > samp[i, "xmin"] & ADCP_longformat[, "distance"] < samp[i, "xmax"]
within_yrange <- ADCP_longformat[, "depth"] > samp[i, "ymin"] & ADCP_longformat[, "depth"] < samp[i, "ymax"]
ech <- ADCP_longformat[which(within_xrange & within_yrange), ]
out[samp[i, "subset_names"]] <- mean(ech[, "value"], na.rm = TRUE)
}
Cordialement,