#This function to convert [min;max] to format c(min,max)
b.convert.range.to.vector <- function(range){
range=str_replace(range,"\\[","")
range=str_replace(range,"\\]","")
range <-unlist(strsplit(range, ";"))
return(as.numeric(range))
}
#This function will change one line species to n line. With n=max-min+1
b.convert.sp.to.specimens <- function(data,charac) {
list_sp=c()
list_value=c()
for (i in 1:length(data[,charac])){
min_max <- as.character(data[,charac])[i]
min_max <- b.convert.range.to.vector(min_max)
#call d is distane
min_value=min(min_max)
max_value=max(min_max)
d <- max_value - min_value
for (j in 0:d){
list_sp<-append(list_sp,as.character(data$sp[i]))
list_value<-append(list_value,min_value+j)
}
}
df <- data.frame(list_sp,list_value)
colnames(df)[colnames(df) == 'list_sp'] <- "sp"
colnames(df)[colnames(df) == 'list_value'] <- charac
return(df)
}
#This function to convert one line species to 2 line min and max
b.convert.sp.to.min.max <- function(data,charac) {
list_sp=c()
list_value=c()
for (i in 1:length(data[,charac])){
min_max <- as.character(data[,charac])[i]
min_max <- b.convert.range.to.vector(min_max)
#call d is distane
min_value=min(min_max)
max_value=max(min_max)
list_sp<-append(list_sp,paste(as.character(data$sp[i]),"min",sep = "_"))
list_value<-append(list_value,min_value)
list_sp<-append(list_sp,paste(as.character(data$sp[i]),"max",sep = "_"))
list_value<-append(list_value,max_value)
}
df <- data.frame(list_sp,list_value)
colnames(df)[colnames(df) == 'list_sp'] <- "sp"
colnames(df)[colnames(df) == 'list_value'] <- charac
return(df)
}
#This function will convert all of columns in data.frame
b.convert.sp.to.min.max.all <-function(data){
list_charactaire <-colnames(data)
b=b.convert.sp.to.min.max(data,list_charactaire[2])
for (charac in list_charactaire[-c(1,2)]){
a <- b.convert.sp.to.min.max(data,charac)
b <- inner_join(b, a)
}
return(b)
}
#This function will convert result from "b.convert.sp.to.specimens" toXper format
b.fusse.individu <-function(result,col){
list_item<-c()
list_etats<-c()
result <- unique(result, by = col)
list_sp <- as.character(unique(result$sp))
for (spi in list_sp) {
result2 <- filter(result, sp==spi)
list_item <- append(list_item, spi)
list_etats <-append(list_etats,paste(result2[,col], collapse = "&"))
}
df <- data.frame(list_item, list_etats)
colnames(df)[colnames(df) == 'list_item'] <- "sp"
colnames(df)[colnames(df) == 'list_etats'] <- col
return(df)
}
#This function will cut all of column in your data.frame by group and return to Xper format
#============================
b.fusse.individu.all <-function(data, group=3){
list_charactaire <-colnames(data)
qual_data <- distinct(data,sp)
for (col in list_charactaire[-1]){
#col="C9"
#group=3
#'convert min-max to specimens
result <- b.convert.sp.to.specimens(data,col)
#'cut to interval
z <- cut2(result[,col], g=group)
#' copy group to data
for (i in 1:length(z)){
result[,col][i] <- as.character(z[i])
}
#'Fusse species
a <- b.fusse.individu(result,col)
qual_data <- inner_join(qual_data, a)
}
return(qual_data)
}
#==============================
#'Function to plot min-max with data.frame have 3 columns "sp","min,"max"
b.plot_min_max <- function(data){
data$min <- as.numeric(data$min)
data$max <- as.numeric(data$max)
ggplot(data, aes(sp))+
geom_linerange(aes(ymin=min,ymax=max),linetype=1,color="blue")+
geom_point(aes(y=min),size=3,color="red")+
geom_point(aes(y=max),size=3,color="red")+
theme_bw()+coord_flip()+
ylab("min-max")+xlab("species")
}