Modérateur : Groupe des modérateurs
Apocalypse now a écrit :L'Horreur ...
Bref ...Gandalf a écrit :Fuyez pauvres fous!
Mickael Canouil a écrit :n'est-il pas possible d'avoir dans la "tab1", une colonne indiquant ce qui se trouve dans "espèces"?
Code : Tout sélectionner
rang <- function(chaine) {
for (nm in names(tab2)) if (chaine %in% tab2[[nm]]) return(nm)
NA
}
tab1$Rang <- sapply(tab1$Especes, rang)
Code : Tout sélectionner
categ_sup <- function(chaine, rang) {
if (is.na(rang)) return(rep(NA, 6))
# première ligne contenant chaine dans tab2
n <- which(tab2[[rang]] == chaine)[1]
# m premiers éléments dans ligne n
rang_num <- setNames(1:6, names(tab2))
res <- unlist(tab2[n, seq(rang_num[rang])])
# complete à 6 avec NA
res <- c(res, rep(NA, 6 - rang_num[rang]))
# ajoute nom de colonnes
names(res) <- names(tab2)
res
}
Code : Tout sélectionner
res <- mapply(categ_sup, tab1$Especes, tab1$Rang, SIMPLIFY = FALSE)
do.call(rbind, res)
On ne maîtrise pas le niveau taxonomique d'identification des organismes. On voudrait tout avoir au niveau de l'espèce. Mais les personnes en charge des comptages vont pouvoir identifier tel organisme observé au niveau de la famille et tel autre au niveau du genre et tel autre au niveau de l'espèce. D'où des listes faunistiques ou floristiques à des niveaux taxonomiques multiples ...Mickael Canouil a écrit :Et d'où vient l'idée farfelue de mélanger le type d'information dans cette colonne?
Code : Tout sélectionner
# bio : le tableau avec la biomasse
bio <- structure(list(Especes = structure(c(1L, 3L, 4L, 2L), .Label = c("Acanthuridae",
"Cancer", "Caranx melampygus", "Pennatulidae"), class = "factor"),
Biomasse = c(10L, 3L, 5L, 10L)), .Names = c("Especes", "Biomasse"
), class = "data.frame", row.names = c(NA, -4L))
# taxo : le tableau avec la taxonomie
taxo <- structure(list(Embranchement = structure(c(2L, 2L, 1L), .Label = c("Arthropoda",
"Chordata"), class = "factor"), Classe = structure(c(1L, 1L,
2L), .Label = c("Actinoperygii", "Malacostraca"), class = "factor"),
Ordre = structure(c(2L, 2L, 1L), .Label = c("Decapoda", "Perciformes"
), class = "factor"), Famille = structure(c(1L, 3L, 2L), .Label = c("Acanthuridae",
"Cancridae", "Carangidae"), class = "factor"), Genre = structure(c(1L,
3L, 2L), .Label = c("Acanthurus", "Cancer", "Caranx"), class = "factor"),
Especes = structure(c(1L, 3L, 2L), .Label = c("Acanthurus leucosternon",
"Cancer pagurus", "Caranx melampygus"), class = "factor")), .Names = c("Embranchement",
"Classe", "Ordre", "Famille", "Genre", "Especes"), row.names = c(NA,
-3L), class = "data.frame")
taxo <- as.matrix(taxo)
m1 <- match(bio$Especes, taxo)
auxi <- nrow(taxo)
nl <- m1 %% auxi
nl[nl %in% 0] <- auxi
taxo2 <- taxo[nl,]
auxi2 <- ncol(taxo)
nc <- findInterval(m1, c(0, auxi*seq_len(ncol(taxo))) + 0.5)
for (i in seq_along(nc)) {
if (is.na(nc[i]) || nc[i]==auxi2)
next
taxo2[i, (nc[i]+1):auxi2] <- NA
}
taxo2 <- as.data.frame(taxo2)
res <- cbind(taxo2, bio[, "Biomasse", drop = FALSE])
res
Embranchement Classe Ordre Famille Genre Especes Biomasse
1 Chordata Actinoperygii Perciformes Acanthuridae <NA> <NA> 10
2 Chordata Actinoperygii Perciformes Carangidae Caranx Caranx melampygus 3
3 <NA> <NA> <NA> <NA> <NA> <NA> 5
4 Arthropoda Malacostraca Decapoda Cancridae Cancer <NA> 10
Code : Tout sélectionner
bio <- structure(list(Especes = structure(c(1L, 3L, 4L, 2L), .Label = c("Acanthuridae",
"Cancer", "Caranx melampygus", "Pennatulidae"), class = "factor"),
Biomasse = c(10L, 3L, 5L, 10L)), .Names = c("Especes", "Biomasse"
), class = "data.frame", row.names = c(NA, -4L))
# taxo : le tableau avec la taxonomie
taxo <- structure(list(Embranchement = structure(c(2L, 2L, 1L), .Label = c("Arthropoda",
"Chordata"), class = "factor"), Classe = structure(c(1L, 1L,
2L), .Label = c("Actinoperygii", "Malacostraca"), class = "factor"),
Ordre = structure(c(2L, 2L, 1L), .Label = c("Decapoda", "Perciformes"
), class = "factor"), Famille = structure(c(1L, 3L, 2L), .Label = c("Acanthuridae",
"Cancridae", "Carangidae"), class = "factor"), Genre = structure(c(1L,
3L, 2L), .Label = c("Acanthurus", "Cancer", "Caranx"), class = "factor"),
Especes = structure(c(1L, 3L, 2L), .Label = c("Acanthurus leucosternon",
"Cancer pagurus", "Caranx melampygus"), class = "factor")), .Names = c("Embranchement",
"Classe", "Ordre", "Famille", "Genre", "Especes"), row.names = c(NA,
-3L), class = "data.frame")
Code : Tout sélectionner
x <- matrix(rnorm(4), nrow = 2, ncol = 2)
x[, 3]
Error in x[, 3] : subscript out of bounds
Code : Tout sélectionner
tab2$nom_sp <- tab1[match(tab2$code_sp, tab1$code_sp, nomatch =NA),"nom_sp"]
Retourner vers « Questions en cours »
Utilisateurs parcourant ce forum : Google [Bot] et 1 invité