1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| mydata<-read.table(file='Bilan_201905.csv', header = TRUE,sep=';')
unique_clone_id <- unique(mydata$clone_id)
## Les données manquantes doivent être remplacées par "NA" dans le fichier source.
## Ajout d'une colonne serie qui aggrege les allèles(=ensemble des x alleles pour un individu)
df <-df %>% bind_cols(unite(data=df %>% select(-1,-2),col = "serie",names(df)[c(-1,-2)],sep="_")) %>%
mutate(serie = str_replace_all(serie,"_NA_","_*_")) ## om mets une étoile * si donnée sur allèle est manquante
##########################################################
### fonction qui remplace les allèles manquants par l'allèle le plus présent chez les autres clone d'un même ramet.
##########################################################
remplacer_manquant <- function(list_pattern_clone,list_pattern_diff) {
res <- map(1:nrow(list_pattern_diff),
~map_chr(1:ncol(list_pattern_diff),~ifelse(list_pattern_diff[.y,.x]=="*",list_pattern_clone[.x],list_pattern_diff[.y,.x]),.y=.x))
matrix(unlist(res),ncol = ncol(list_pattern_diff),byrow = T)
}
##########################################################
### fonction qui vérifie si les clones d'un ramet sont identiques ###
##########################################################
verifier_clone <- function(unique_clone){
## on filtre par le clone
filter_clones <- df %>% filter(mydata$clone_id == unique_clone)
## on regroupe par série les individus avec un numéro de clone identique.
group_clones <- dff %>% group_by(unique_clone,série) %>% summarise(nb= n())
if(max(df2$nb)<3){ # si le nombre de ligne identiques est inferieur à 3
message("erreur, le nombre de clones identiques n'est pas suffisant (<3)")
return(unique_clone_id)
}else if(max(df2$nb==5)){ # si les nombre de ligne identiques est égal à 5
message(str_c(clone," ok, les 5 clones sont identiques"))
}else{
pattern_clone= df2 %>% filter(nb == max(nb)) %>% pull(serie) #on récupère les clones identiques
pattern_diff = df2 %>% filter(nb != max(nb)) %>% ungroup()%>% select(serie) #on isole les clones différents
## on découpe les séries d'allèle
# série d'alleles pour les bon clones (redondance>3)
list_pattern_clone=str_split(pattern_clone,"_",simplify = T)
# série d'alleles clones différents
list_pattern_diff=map(1:nrow(pattern_diff),~str_split(pattern_diff %>% slice(.x) %>% pull(serie),"_",simplify= T))
list_pattern_diff=matrix(unlist(list_pattern_diff),nrow=length(list_pattern_diff),byrow = T)
## on remplace les valeurs manquantess (*) par la valeur de l'allèle correspondant au
## pattern de la série des bons clone pour ne pas les comptabliser comme différence
list_pattern_diff =remplacer_manquant(list_pattern_clone,list_pattern_diff)
## On ajoute l'individu à un data.frame si la différence porte sur au moins 2 allèles
res <- map_df(1:nrow(list_pattern_diff),~df2 %>% filter(serie == str_c(list_pattern_diff[.x,],collapse ="_")) %>%
mutate(difference = sum(is.na(str_match(list_pattern_clone,list_pattern_diff[.x,]))))) %>% filter(difference>1)
}
}
## pour trouver tous les individus différents
resultat <- map_df(unique(df$clones),verifier_clone) |
Partager