Repository 'tool_anonymization'
hg clone https://toolshed.g2.bx.psu.edu/repos/ecology/tool_anonymization

Changeset 0:726a387cfdc2 (2021-08-13)
Commit message:
"planemo upload for repository https://github.com/Marie59/Data_explo_tools commit 60627aba07951226c8fd6bb3115be4bd118edd4e"
added:
LICENSE.md
anonymization.xml
funct_anomy.r
functions.r
graph_homogeneity_normality.r
graph_lcbd.r
graph_link_var.r
graph_pres_abs_abund.r
graph_stat_presence_abs.r
macro.xml
test-data/Data.tabular
test-data/Missing_species.txt
test-data/Reel_life_survey_fish_modif.tabular
test-data/Reel_life_survey_fish_modif2.tabular
test-data/SCBD.txt
test-data/data_frenchbbs.tabular
test-data/levene.txt
test-data/species.txt
test-data/test_bbs2.txt
test-data/test_fish2.tabular
test-data/test_value_fish2.txt
b
diff -r 000000000000 -r 726a387cfdc2 LICENSE.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/LICENSE.md Fri Aug 13 18:17:11 2021 +0000
b
b'@@ -0,0 +1,674 @@\n+                    GNU GENERAL PUBLIC LICENSE\n+                       Version 3, 29 June 2007\n+\n+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n+ Everyone is permitted to copy and distribute verbatim copies\n+ of this license document, but changing it is not allowed.\n+\n+                            Preamble\n+\n+  The GNU General Public License is a free, copyleft license for\n+software and other kinds of works.\n+\n+  The licenses for most software and other practical works are designed\n+to take away your freedom to share and change the works.  By contrast,\n+the GNU General Public License is intended to guarantee your freedom to\n+share and change all versions of a program--to make sure it remains free\n+software for all its users.  We, the Free Software Foundation, use the\n+GNU General Public License for most of our software; it applies also to\n+any other work released this way by its authors.  You can apply it to\n+your programs, too.\n+\n+  When we speak of free software, we are referring to freedom, not\n+price.  Our General Public Licenses are designed to make sure that you\n+have the freedom to distribute copies of free software (and charge for\n+them if you wish), that you receive source code or can get it if you\n+want it, that you can change the software or use pieces of it in new\n+free programs, and that you know you can do these things.\n+\n+  To protect your rights, we need to prevent others from denying you\n+these rights or asking you to surrender the rights.  Therefore, you have\n+certain responsibilities if you distribute copies of the software, or if\n+you modify it: responsibilities to respect the freedom of others.\n+\n+  For example, if you distribute copies of such a program, whether\n+gratis or for a fee, you must pass on to the recipients the same\n+freedoms that you received.  You must make sure that they, too, receive\n+or can get the source code.  And you must show them these terms so they\n+know their rights.\n+\n+  Developers that use the GNU GPL protect your rights with two steps:\n+(1) assert copyright on the software, and (2) offer you this License\n+giving you legal permission to copy, distribute and/or modify it.\n+\n+  For the developers\' and authors\' protection, the GPL clearly explains\n+that there is no warranty for this free software.  For both users\' and\n+authors\' sake, the GPL requires that modified versions be marked as\n+changed, so that their problems will not be attributed erroneously to\n+authors of previous versions.\n+\n+  Some devices are designed to deny users access to install or run\n+modified versions of the software inside them, although the manufacturer\n+can do so.  This is fundamentally incompatible with the aim of\n+protecting users\' freedom to change the software.  The systematic\n+pattern of such abuse occurs in the area of products for individuals to\n+use, which is precisely where it is most unacceptable.  Therefore, we\n+have designed this version of the GPL to prohibit the practice for those\n+products.  If such problems arise substantially in other domains, we\n+stand ready to extend this provision to those domains in future versions\n+of the GPL, as needed to protect the freedom of users.\n+\n+  Finally, every program is threatened constantly by software patents.\n+States should not allow patents to restrict development and use of\n+software on general-purpose computers, but in those that do, we wish to\n+avoid the special danger that patents applied to a free program could\n+make it effectively proprietary.  To prevent this, the GPL assures that\n+patents cannot be used to render the program non-free.\n+\n+  The precise terms and conditions for copying, distribution and\n+modification follow.\n+\n+                       TERMS AND CONDITIONS\n+\n+  0. Definitions.\n+\n+  "This License" refers to version 3 of the GNU General Public License.\n+\n+  "Copyright" also means copyright-like laws that apply to other kinds of\n+works, such as semiconductor masks.\n+\n+  "The Program" refers to '..b'HE PROGRAM\n+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\n+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n+\n+  16. Limitation of Liability.\n+\n+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\n+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\n+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\n+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\n+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\n+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\n+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\n+SUCH DAMAGES.\n+\n+  17. Interpretation of Sections 15 and 16.\n+\n+  If the disclaimer of warranty and limitation of liability provided\n+above cannot be given local legal effect according to their terms,\n+reviewing courts shall apply local law that most closely approximates\n+an absolute waiver of all civil liability in connection with the\n+Program, unless a warranty or assumption of liability accompanies a\n+copy of the Program in return for a fee.\n+\n+                     END OF TERMS AND CONDITIONS\n+\n+            How to Apply These Terms to Your New Programs\n+\n+  If you develop a new program, and you want it to be of the greatest\n+possible use to the public, the best way to achieve this is to make it\n+free software which everyone can redistribute and change under these terms.\n+\n+  To do so, attach the following notices to the program.  It is safest\n+to attach them to the start of each source file to most effectively\n+state the exclusion of warranty; and each file should have at least\n+the "copyright" line and a pointer to where the full notice is found.\n+\n+    <one line to give the program\'s name and a brief idea of what it does.>\n+    Copyright (C) <year>  <name of author>\n+\n+    This program is free software: you can redistribute it and/or modify\n+    it under the terms of the GNU General Public License as published by\n+    the Free Software Foundation, either version 3 of the License, or\n+    (at your option) any later version.\n+\n+    This program is distributed in the hope that it will be useful,\n+    but WITHOUT ANY WARRANTY; without even the implied warranty of\n+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+    GNU General Public License for more details.\n+\n+    You should have received a copy of the GNU General Public License\n+    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n+\n+Also add information on how to contact you by electronic and paper mail.\n+\n+  If the program does terminal interaction, make it output a short\n+notice like this when it starts in an interactive mode:\n+\n+    <program>  Copyright (C) <year>  <name of author>\n+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w\'.\n+    This is free software, and you are welcome to redistribute it\n+    under certain conditions; type `show c\' for details.\n+\n+The hypothetical commands `show w\' and `show c\' should show the appropriate\n+parts of the General Public License.  Of course, your program\'s commands\n+might be different; for a GUI interface, you would use an "about box".\n+\n+  You should also get your employer (if you work as a programmer) or school,\n+if any, to sign a "copyright disclaimer" for the program, if necessary.\n+For more information on this, and how to apply and follow the GNU GPL, see\n+<https://www.gnu.org/licenses/>.\n+\n+  The GNU General Public License does not permit incorporating your program\n+into proprietary programs.  If your program is a subroutine library, you\n+may consider it more useful to permit linking proprietary applications with\n+the library.  If this is what you want to do, use the GNU Lesser General\n+Public License instead of this License.  But first, please read\n+<https://www.gnu.org/licenses/why-not-lgpl.html>.\n'
b
diff -r 000000000000 -r 726a387cfdc2 anonymization.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/anonymization.xml Fri Aug 13 18:17:11 2021 +0000
[
@@ -0,0 +1,71 @@
+<tool id="tool_anonymization" name="Spatial coordinates anonymization" version="@VERSION@" profile="20.01">
+    <description> 
+        without loss of the spatial relationships
+    </description>
+    <macros>
+        <import>macro.xml</import>
+    </macros>
+    <requirements> 
+        <requirement  type="package" version="0.8.1">r-tangles</requirement>
+    </requirements>
+    <command detect_errors="exit_code"><![CDATA[
+        Rscript
+            '$__tool_directory__/funct_anomy.r'
+            '$input'
+            '$colnames'
+            '$latitude'
+            '$longitude'
+            '$output'
+        ]]>
+        </command>
+        <inputs>
+            <expand macro="explo_input"/>
+            <param name="latitude" label="Select column containing latitudes in decimal degrees" type="data_column" numerical="true" data_ref="input" multiple="false" use_header_names="true"/>
+            <param name="longitude" label="Select column containing longitudes in decimal degrees" type="data_column" numerical="true" data_ref="input" multiple="false" use_header_names="true"/>
+        </inputs>
+        <outputs>
+            <data name="output" from_work_dir="anonym_data.tabular" format="tabular"/>
+        </outputs>
+        <tests>
+            <test>
+                <param name="input" value="Reel_life_survey_fish_modif.tabular"/>
+                <param name="colnames" value="true"/>
+                <param name="latitude" value="9"/>
+                <param name="longitude" value="10"/>
+                <output name="output">
+                    <assert_contents>
+                        <has_n_lines n="290"/>
+                    </assert_contents>
+                </output>
+            </test>
+        </tests>
+        <help><![CDATA[
+=====================================================
+Anonymization of the spatial coordinates of your data
+=====================================================
+
+
+**What it does**
+
+This tool anonymizes (random with 3 levels of abstraction) longitude and latitude decimal degrees coordinates of a tabular file without loss of the spatial relationships within the data. Handy to allow the sharing of sensitive data regarding threatened species or human activities for instance. 
+
+Input description :
+
+A tabular file with observation data. Must at least contain two columns, latitudes and longitudes.
+
++-------------+------------+
+|   latitude  |  longitude |
++=============+============+
+|      2      |      4     | 
++-------------+------------+
+|     ...     |     ...    |
++-------------+------------+
+
+Output description :
+
+A tabular file with your original data file with its longitude and latitude replaced by anonymized longitudes and latitudes.
+
+    ]]></help>   
+    <citations>
+    </citations>               
+</tool>
b
diff -r 000000000000 -r 726a387cfdc2 funct_anomy.r
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/funct_anomy.r Fri Aug 13 18:17:11 2021 +0000
[
@@ -0,0 +1,39 @@
+#Rscript
+
+###########################
+##     Anonymization     ##
+###########################
+
+#####Packages : tangles
+
+#Load arguments
+
+args <- commandArgs(trailingOnly = TRUE)
+
+if (length(args) == 0) {
+    stop("This tool needs at least one argument")
+}else{
+    table <- args[1]
+    hr <- args[2]
+    latitude <- as.numeric(args[3])
+    longitude <- as.numeric(args[4])
+}
+
+if (hr == "false") {
+  hr <- FALSE
+}else{
+  hr <- TRUE
+}
+
+#####Import data
+data <- read.table(table, sep = "\t", dec = ".", header = hr, fill = TRUE, encoding = "UTF-8")
+
+randomized_data <- tangles::tangles(data = as.matrix(data[, c(latitude, longitude)]), depth = 3, rasterdata = FALSE, raster_object = FALSE, saveTangles = FALSE, path = NULL)

+data[, c(latitude, longitude)] <- NULL
+
+tab_anon <- data.frame(longitude = randomized_data[[1]]$X, latitude = randomized_data[[1]]$Y)
+
+tab_anon <- cbind(data, tab_anon)
+
+write.table(tab_anon, "anonym_data.tabular", row.names = FALSE, quote = FALSE, sep = "\t", dec = ".", fileEncoding = "UTF-8")
b
diff -r 000000000000 -r 726a387cfdc2 functions.r
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/functions.r Fri Aug 13 18:17:11 2021 +0000
[
@@ -0,0 +1,22 @@
+#Rscript
+
+#########################################################################################
+####################### Exploration data tools function #################################
+#########################################################################################
+#### Based on Romain Lorrillière R script
+#### Modified by Alan Amosse, Benjamin Yguel and Marie Jossé for integrating within Galaxy-E
+
+######################################### start of the function makeTableAnalyse
+##Species are placed in separated columns and addition of zero on plots where at least one selected species is present
+make_table_analyse <- function(data, var, spe, var2, var3) {
+    tab <- reshape(data
+                  , v.names = var
+                  , idvar = c(var2, var3)
+                  , timevar = spe
+                  , direction = "wide")
+    tab[is.na(tab)] <- 0 ###### remplace les na par des 0 / replace NAs by 0
+
+    colnames(tab) <- sub(paste0(var, "."), "", colnames(tab))### remplace le premier pattern "abond." par le second "" / replace the column names "abond." by ""
+    return(tab)
+}
+######################################### end of the function makeTableAnalyse
b
diff -r 000000000000 -r 726a387cfdc2 graph_homogeneity_normality.r
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graph_homogeneity_normality.r Fri Aug 13 18:17:11 2021 +0000
[
@@ -0,0 +1,130 @@
+#Rscript
+
+#######################################
+##     Homogeneity and normality     ##
+#######################################
+
+#####Packages : car
+#               ggplot2
+#               ggpubr
+#               Cowplot
+
+#####Load arguments
+
+args <- commandArgs(trailingOnly = TRUE)
+
+if (length(args) == 0) {
+    stop("This tool needs at least one argument")
+}else{
+    table <- args[1]
+    hr <- args[2]
+    date <- as.numeric(args[3])
+    spe <- as.numeric(args[4])
+    var <- as.numeric(args[5])
+}
+
+if (hr == "false") {
+  hr <- FALSE
+}else{
+  hr <- TRUE
+}
+
+#####Import data
+data <- read.table(table, sep = "\t", dec = ".", header = hr, fill = TRUE, encoding = "UTF-8")
+data <- na.omit(data)
+coldate <- colnames(data)[date]
+colspe <- colnames(data)[spe]
+colvar <- colnames(data)[var]
+
+#####Your analysis
+
+####Homogeneity of the variance####
+
+##Test of Levene##
+testlevene <- function(data, col1, col2) {
+        data[, col1] <- as.numeric(data[, col1])
+        data[, col2] <- as.factor(data[, col2])
+    tb_levene <- car::leveneTest(y = data[, col1], group = data[, col2])
+
+    return(tb_levene)
+    }
+levene <- capture.output(testlevene(data = data, col1 = colvar, col2 = colspe))
+
+cat("\nwrite table with levene test. \n--> \"", paste(levene, "\"\n", sep = ""), file = "levene.txt", sep = "", append = TRUE)
+
+##Two boxplots to visualize it##
+
+homog_var <- function(data, col1, col2, col3, mult) {
+    data[, col1] <- as.factor(data[, col1])
+    if (mult) {
+            for (spe in unique(data[, col2])) {
+             data_cut <- data[data[, col2] == spe, ]
+             graph_2 <- ggplot2::ggplot(data_cut, ggplot2::aes_string(x = col1, y = col3, color = col1)) +
+             ggplot2::geom_boxplot() +
+             ggplot2::theme(legend.position = "none", axis.text.x = ggplot2::element_text(angle = 90, vjust = 0.5, hjust = 1), panel.background = ggplot2::element_rect(fill = "#d9d4c5", colour = "#d9d4c5", linetype = "solid"),
+              panel.grid.major = ggplot2::element_line(linetype = "solid", colour = "white"),
+              panel.grid.minor = ggplot2::element_line(linetype = "solid", colour = "white"))
+
+            ggplot2::ggsave(paste("Homogeneity_of_", spe, ".png"), graph_2, width = 16, height = 9, units = "cm")
+            }
+        }else{
+        graph_1 <- ggplot2::ggplot(data, ggplot2::aes_string(x = col1, y = col3, color = col1)) +
+          ggplot2::geom_boxplot() +
+          ggplot2::theme(legend.position = "none", axis.text.x = ggplot2::element_text(angle = 90, vjust = 0.5, hjust = 1))
+
+    #Put multiple panels
+    graph_2 <- graph_1 + ggplot2::facet_grid(rows = ggplot2::vars(data[, col2]), scales = "free") +
+      ggplot2::theme(panel.background = ggplot2::element_rect(fill = "#d9d4c5", colour = "#d9d4c5", linetype = "solid"),
+          panel.grid.major = ggplot2::element_line(linetype = "solid", colour = "white"),
+          panel.grid.minor = ggplot2::element_line(linetype = "solid", colour = "white"))
+
+    ggplot2::ggsave("Homogeneity.png", graph_2, width = 16, height = 9, units = "cm")
+        }
+}
+
+####Normality of the distribution####
+# Kolmogorov-Smirnov test
+
+ks <- capture.output(ks.test(x = data[, var], y = "pnorm", alternative = "two.sided"))
+
+cat("\nwrite table with Kolmogorov-Smirnov test. \n--> \"", paste(ks, "\"\n", sep = ""), file = "ks.txt", sep = "", append = TRUE)
+
+#Histogramm with distribution line
+graph_hist <- function(data, var1) {
+  graph_hist <- ggplot2::ggplot(data) +
+  ggplot2::geom_histogram(ggplot2::aes_string(x = var1), binwidth = 2, color = "black", fill = "white") +
+  ggplot2::geom_density(ggplot2::aes_string(var1), alpha = 0.12, fill = "red") +
+  ggplot2::ggtitle("Distribution histogram")
+
+return(graph_hist)
+}
+
+#Add the mean dashed line
+add_mean <- function(graph, var1) {
+  graph_mean <- graph + ggplot2::geom_vline(xintercept = mean(data[, var1]),
+              color = "midnightblue", linetype = "dashed", size = 1)
+
+return(graph_mean)
+}
+
+#Adding a QQplot
+graph_qqplot <- function(data, var1) {
+  graph2 <- ggpubr::ggqqplot(data, var1, color = "midnightblue") + ggplot2::ggtitle("Q-Q plot")
+
+return(graph2)
+}
+
+#On suppose que les données sont distribuées normalement lorsque les points suivent approximativement la ligne de référence à 45 degrés.
+
+graph_fin <- function(graph1, graph2) {
+  graph <- cowplot::plot_grid(graph1, graph2, ncol = 2, nrow = 1)
+
+  ggplot2::ggsave("Normal_distribution.png", graph, width = 10, height = 7, units = "cm")
+}
+
+mult <- ifelse(length(unique(data[, colspe])) == 2, FALSE, TRUE)
+homog_var(data, col1 = coldate, col2 = colspe, col3 = colvar, mult = mult)
+
+graph_hist1 <- graph_hist(data, var1 = colvar)
+graph_mean <- add_mean(graph = graph_hist1, var1 = colvar)
+graph_fin(graph1 = graph_mean, graph2 = graph_qqplot(data, var1 = colvar))
b
diff -r 000000000000 -r 726a387cfdc2 graph_lcbd.r
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graph_lcbd.r Fri Aug 13 18:17:11 2021 +0000
[
b'@@ -0,0 +1,225 @@\n+#Rscript\n+\n+#########################\n+##    Beta diversity   ##\n+#########################\n+\n+#####Packages : ggplot2\n+#               vegan\n+#               adespatial\n+#               dplyr\n+#               tibble\n+#               tdyr\n+\n+#####Load arguments\n+\n+args <- commandArgs(trailingOnly = TRUE)\n+\n+if (length(args) < 2) {\n+    stop("This tool needs at least 2 arguments")\n+}else{\n+    table <- args[1]\n+    hr <- args[2]\n+    abund <- as.numeric(args[3])\n+    loc <- as.numeric(args[4])\n+    spe <- as.numeric(args[5])\n+    date <- as.numeric(args[6])\n+    map <- as.logical(args[7])\n+    sepa <- as.logical(args[8])\n+    not <- as.logical(args[9])\n+    lat <- as.numeric(args[10])\n+    long <- as.numeric(args[11])\n+    var <- as.numeric(args[12])\n+    source(args[13])\n+}\n+\n+if (hr == "false") {\n+  hr <- FALSE\n+}else{\n+  hr <- TRUE\n+}\n+\n+#####Import data\n+data <- read.table(table, sep = "\\t", dec = ".", header = hr, fill = TRUE, encoding = "UTF-8")\n+colabund <- colnames(data)[abund]\n+colloc <- colnames(data)[loc]\n+if (map) {\n+  collat <- colnames(data)[lat]\n+  collong <- colnames(data)[long]\n+}\n+colspe <- colnames(data)[spe]\n+coldate <- colnames(data)[date]\n+data[, coldate] <- as.factor(data[, coldate])\n+\n+data <- data[grep("^$", data[, spe], invert = TRUE), ]\n+\n+if (sepa) {\n+colvar <- colnames(data)[var]\n+}\n+\n+# Data for species\n+data_num <- make_table_analyse(data, colabund, colspe, colloc, coldate)\n+nb_spe <- length(unique(data[, spe]))\n+nb_col <- ncol(data_num) - nb_spe + 1\n+\n+#Data with coordinates and environmental\n+if (map) {\n+  data_xy <- data_num[, c(collat, collong)]\n+  colnames(data_xy) <- c("latitude", "longitude")\n+  # Data for environment\n+  data_env <- data_num[, c(colloc, collat, collong)]\n+  colnames(data_env) <- c("site", "latitude", "longitude")\n+}\n+\n+# Data with only species and their abundance\n+data_spe <- data_num[, nb_col:ncol(data_num)]\n+rownames(data_spe) <- paste0(data_num[, colloc], " - ", data_num[, coldate])\n+\n+#####Your analysis\n+\n+# Computation beta.div {adespatial}\n+# Beta.div on Hellinger-transformed species data\n+data_beta <- adespatial::beta.div(data_spe, method = "hellinger", nperm = 9999)\n+\n+save(data_beta, file = "beta_diversity.Rdata")\n+cat("##############################################################################",\n+    "\\n########################### Beta Diversity Summary ###########################",\n+    "\\n##############################################################################",\n+    "\\n\\n### All data ###",\n+    "\\nBeta diversity: ", data_beta$beta[[2]],\n+    "\\nSum of Squares: ", data_beta$beta[[1]],\n+    "\\n\\n### Vector of Local Contributions to Beta Diversity (LCBD) for the sites each date ###",\n+    "\\n", capture.output(data_beta$LCBD),\n+    "\\n\\n### Vector of P-values associated with the LCBD indices ###",\n+    "\\n", capture.output(data_beta$p.LCBD),\n+    "\\n\\n### Vector of Corrected P-values for the LCBD indices, Holm correction ###",\n+    "\\n", capture.output(data_beta$p.adj),\n+    "\\n\\n### Vector of Species contributions to beta diversity (SCBD) ###",\n+    "\\n", capture.output(data_beta$SCBD), file = "LCBD.txt", fill = 1, append = TRUE)\n+\n+# Which species have a SCBD larger than the mean SCBD?\n+scbd <- capture.output(data_beta$SCBD[data_beta$SCBD >= mean(data_beta$SCBD)])\n+write(scbd, "SCBD.txt")\n+\n+##1st fonction\n+beta_div_ext <- function(data_beta, data_xy, data_env) {\n+   data_beta_ext <- data.frame(data_xy, data_env, LCBD = data_beta$LCBD * 100, p.LCBD = data_beta$p.LCBD, signif = data_beta$p.LCBD < 0.05)\n+\n+  graph_beta_ext <- ggplot2::ggplot(data = data_beta_ext, ggplot2::aes(x = latitude, y = longitude, size = LCBD, col = signif)) +\n+  ggplot2::geom_point() +\n+  ggplot2::scale_colour_manual(values = c("#57bce0", "#ce0b0b"), labels = c("Non significant", "Significant"), name = "Significance at 0.05") +\n+  ggplot2::xlab("Longitude") + ggplot2::ylab("Latitude")\n+\n+  ggplot2::ggsave("Beta_diversity_through_space.png", graph_beta_ext)\n+}\n+\n'..b'###\n+\n+####LCBD####\n+lcbd_site <- adespatial::beta.div(data_spe, "hellinger", nperm = 999)\n+\n+compute_lcbd <- function(data_beta, data_spe, data_num) {\n+\n+#############\n+  mat_lcbd_site <- data.frame(data_spe, LCBD = data_beta$LCBD * 100, p.LCBD = data_beta$p.LCBD, signif = data_beta$p.LCBD < 0.05, site = data_num[, colloc], date = data_num[, coldate])\n+\n+## Map spatio-temp\n+##################\n+  p1 <- ggplot2::qplot(date, site, size = LCBD, col = signif, data = mat_lcbd_site)\n+  p1 <- p1 + ggplot2::scale_colour_manual(values = c("#57bce0", "#ce0b0b"), labels = c("Non significant", "Significant"), name = "Significance at 0.05")\n+  p1 <- p1 + ggplot2::theme_bw() + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 90)) + ggplot2::xlab("Date") + ggplot2::ylab("Site")\n+\n+  ggplot2::ggsave("LCBD_sites_time.png", p1)\n+\n+\n+## Par ann\xc3\xa9es\n+#############\n+  mean_time <- tapply(mat_lcbd_site$LCBD, mat_lcbd_site$date, mean)\n+  sd_time <- tapply(mat_lcbd_site$LCBD, mat_lcbd_site$date, sd)\n+  date <- unique(mat_lcbd_site$date)\n+\n+  data <- data.frame(date, mean_time, sd_time)\n+\n+  time <- ggplot2::ggplot() + ggplot2::geom_pointrange(ggplot2::aes(x = date, y = mean_time, ymin = mean_time - sd_time, ymax = mean_time + sd_time), data = data)\n+  time <- time + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 90), axis.line.y = ggplot2::element_line(size = 0.5)) + ggplot2::ylab("mean LCBD")\n+\n+  ggplot2::ggsave("Mean_LCBD_through_time.png", time)\n+}\n+\n+## Choose another graph\n+#######################\n+compute_lcbd2 <- function(data_beta, data_spe, data_num) {\n+\n+#############\n+  mat_lcbd_site <- data.frame(data_spe, LCBD = data_beta$LCBD * 100, p.LCBD = data_beta$p.LCBD, signif = data_beta$p.LCBD < 0.05, site = data_num[, colloc], date = data_num[, coldate], variable = data_num[, colvar])\n+\n+  p1 <- ggplot2::qplot(date, variable, size = LCBD, col = signif, data = mat_lcbd_site)\n+  p1 <- p1 + ggplot2::scale_colour_manual(values = c("#57bce0", "#ce0b0b"), labels = c("Non significant", "Significant"), name = "Significance at 0.05")\n+  p1 <- p1 + ggplot2::theme_bw() + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 90)) + ggplot2::xlab("Date") + ggplot2::ylab(colvar)\n+\n+  ggplot2::ggsave(paste0("LCBD_per_", colvar, "_through_time.png"), p1)\n+}\n+\n+####SCBD###\n+# Function to compute SCBD\n+library(dplyr)\n+make_scbd_uvc <- function(data_spe, z, data_beta) {\n+  # Computation using beta.div {adespatial} on\n+  # Hellinger-transformed species data\n+\n+  # Which species have a SCBD larger than the mean SCBD?\n+  spe_scbd <-  data_beta$SCBD[data_beta$SCBD >= mean(data_beta$SCBD)] %>%\n+    as.data.frame() %>%\n+    tibble::rownames_to_column(var = "Taxon") %>%\n+    dplyr::mutate("Methode" = z)\n+\n+  return(spe_scbd)\n+}\n+\n+# Function to make a radar plot\n+\n+coord_radar <- function(theta = "x", start = 0, direction = 1) {\n+  theta <- match.arg(theta, c("x", "y"))\n+  r <- if (theta == "x") "y" else "x"\n+  ggplot2::ggproto("CordRadar", ggplot2::coord_polar(theta = theta, start = start,\n+          direction = sign(direction)),\n+          is_linear = function(coord) TRUE)\n+}\n+\n+# Make the radar plot\n+radar_plot <- function(scbd_uvc_tc) {\n+  uvc_rd_plot_data <- scbd_uvc_tc %>%\n+    rename(scbd_score = ".")\n+\n+  rad_uvc <- ggplot2::ggplot(uvc_rd_plot_data, ggplot2::aes(x = Taxon, y = scbd_score, group = Methode)) +\n+    ggplot2::geom_line() +\n+    ggplot2::geom_point(size = 3) +\n+    coord_radar() +\n+    ggplot2::theme_bw() +\n+    ggplot2::theme(axis.text.x = ggplot2::element_text(size = 10),\n+        legend.position = "bottom")\n+\n+  ggplot2::ggsave("SCBD_Species_Radar_plot.png", rad_uvc)\n+}\n+\n+## LCBD\n+\n+if (map) {\n+  #Beta diversity\n+  beta_div_ext(data_beta, data_xy, data_env)\n+}\n+\n+#Lcbd per places and time\n+compute_lcbd(data_beta, data_spe, data_num)\n+\n+#Lcbd of your choice\n+if (sepa) {\n+  compute_lcbd2(data_beta, data_spe, data_num)\n+}\n+\n+##SCBD\n+\n+scbd_uvc_tc <- make_scbd_uvc(data_spe, z = "TC", data_beta)\n+\n+radar_plot(scbd_uvc_tc)\n'
b
diff -r 000000000000 -r 726a387cfdc2 graph_link_var.r
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graph_link_var.r Fri Aug 13 18:17:11 2021 +0000
[
b'@@ -0,0 +1,296 @@\n+#Rscript\r\n+\r\n+################################################\r\n+##    Link between variables and themselves   ##\r\n+################################################\r\n+\r\n+#####Packages : ggplot2\r\n+#               Cowplot\r\n+#               Car\r\n+#               faraway\r\n+#               dplyr\r\n+#               GGally\r\n+#               FactoMiner\r\n+#               factoextra\r\n+#               ggcorrplot\r\n+\r\n+#####Load arguments\r\n+\r\n+args <- commandArgs(trailingOnly = TRUE)\r\n+\r\n+if (length(args) == 0) {\r\n+    stop("This tool needs at least one argument")\r\n+}else{\r\n+    table <- args[1]\r\n+    hr <- args[2]\r\n+    colli <- as.logical(args[3])\r\n+    vif <- as.logical(args[4])\r\n+    pca <- as.logical(args[5])\r\n+    interr <- as.logical(args[6])\r\n+    auto <- as.logical(args[7])\r\n+    spe <- as.numeric(args[8])\r\n+    col <- as.numeric(strsplit(args[9], ",")[[1]])\r\n+    var <- as.numeric(args[10])\r\n+    var2 <- as.numeric(args[11])\r\n+    var4 <- as.numeric(args[12])\r\n+}\r\n+\r\n+if (hr == "false") {\r\n+  hr <- FALSE\r\n+}else{\r\n+  hr <- TRUE\r\n+}\r\n+\r\n+if (length(col) == 1) {\r\n+stop("Please select two or more numerical columns")\r\n+}\r\n+\r\n+#####Import data\r\n+data <- read.table(table, sep = "\\t", dec = ".", header = hr, fill = TRUE, encoding = "UTF-8")\r\n+if (vif | pca) {\r\n+data_active <- data[col]\r\n+#Define the active individuals and the active variables for the PCA\r\n+}\r\n+\r\n+if (colli | interr) {\r\n+colspe <- colnames(data)[spe]\r\n+}\r\n+\r\n+if (colli) {\r\n+data_num <- data[col]\r\n+data_num$species <- data[, spe]\r\n+data_num <- data_num[grep("^$", data_num$spe, invert = TRUE), ]\r\n+}\r\n+\r\n+if (interr | auto) {\r\n+colvar <- colnames(data)[var]\r\n+}\r\n+\r\n+if (interr) {\r\n+colvar2 <- colnames(data)[var2]\r\n+colvar4 <- colnames(data)[var4]\r\n+}\r\n+\r\n+#####Your analysis\r\n+\r\n+####Independence of the observations####\r\n+\r\n+acf_tb <- function(data, var) {\r\n+obj <- acf(data[, var], na.action = na.pass)\r\n+  return(obj)\r\n+}\r\n+\r\n+acf_df <- function(data, var) {\r\n+\r\n+tb <- data.frame(acf = acf_tb(data, var)$acf, lag = acf_tb(data, var)$lag)\r\n+\r\n+  return(tb) # Lag: intervalle temporel entre mesures, fr\xc3\xa9quence \xc3\xa0 laquelle on mesure l\'auto corr\xc3\xa9lation.\r\n+# ACF: ind\xc3\xa9pendance temporelle\r\n+}\r\n+\r\n+autocorr <- function(var1, var2) {\r\n+  cat("\\nACF\\n", var2$acf, file = "acf.txt", fill = 1, append = TRUE)\r\n+  graph <- ggplot2::ggplot() +\r\n+  ggplot2::geom_bar(ggplot2::aes(x = var2$lag, y = var2$acf), stat = "identity", position = "identity", fill = "midnightblue") +\r\n+  ggplot2::geom_hline(mapping = ggplot2::aes(yintercept = qnorm((1 + 0.95) / 2) / sqrt(var1$n.used)),\r\n+             linetype = "dashed") + # calcul interval de confiance \xc3\xa0 95% sans correction du bruit blanc.\r\n+  ggplot2::geom_hline(mapping = ggplot2::aes(yintercept = -qnorm((1 + 0.95) / 2) / sqrt(var1$n.used)), linetype = "dashed") + ggplot2::labs(title = "Autocorrelation") + ggplot2::xlab("lag") + ggplot2::ylab("acf")\r\n+  ggplot2::theme(plot.title = ggplot2::element_text(hjust = 0.5))\r\n+\r\n+  ggplot2::ggsave("autocorrelation.png", graph)\r\n+}\r\n+\r\n+####Interractions####\r\n+\r\n+graph <- function(data, var1, var2, var3) {\r\n+  graph <- ggplot2::ggplot(data, ggplot2::aes_string(x = var1, y = var2, group = var3, color = var3)) +\r\n+  ggplot2::geom_point() +\r\n+  ggplot2::geom_smooth(method = lm, se = FALSE) +\r\n+  ggplot2::theme(plot.title = ggplot2::element_text(color = "black", size = 12, face = "bold"))\r\n+\r\n+return(graph)\r\n+}\r\n+\r\n+# Put multiple panels\r\n+interraction <- function(data, var1, var2, var3, var4) {\r\n+  cat("\\nSpecies\\n", spe, file = "Species.txt", fill = 1, append = TRUE)\r\n+  if (mult1) {\r\n+      for (spe in unique(data[, var3])) {\r\n+      data_cut <- data[data[, var3] == spe, ]\r\n+      mult_graph <- graph(data_cut, var1, var2, var3) + ggplot2::facet_grid(cols = ggplot2::vars(data_cut[, var4]), scales = "free") +\r\n+      cowplot::background_grid(major = "xy", minor = "none") +\r\n+      cowplot::panel_border() + ggplot2::ggtitle("Interactions")\r\n+\r\n+      ggplot2::ggsave(paste("interaction_of_", spe'..b'+}\r\n+\r\n+####PCA method####\r\n+\r\n+plot_pca <- function(data) {\r\n+  #Correlation circle\r\n+  graph_corr <- factoextra::fviz_pca_var(active_data(data), col.var = "cos2",\r\n+                           gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),\r\n+                           repel = TRUE #Avoid text overlap\r\n+                           )\r\n+  ggplot2::ggsave("Pca_circle.png", graph_corr)\r\n+}\r\n+\r\n+plot_qual <- function(data) {\r\n+  #PCA results for variables\r\n+  var <- factoextra::get_pca_var(active_data(data))\r\n+\r\n+  #representation quality\r\n+  graph_quality <- ggcorrplot::ggcorrplot(var$cos2[!apply(var$cos2, 1, anyNA), ], method = "circle",\r\n+  ggtheme = ggplot2::theme_gray,\r\n+  colors = c("#00AFBB", "#E7B800", "#FC4E07"))\r\n+\r\n+  ggplot2::ggsave("Pca_quality.png", graph_quality)\r\n+}\r\n+\r\n+#### Variance inflation factor ####\r\n+\r\n+myvif <- function(mod) {\r\n+  v <- vcov(mod)\r\n+  assign <- attributes(model.matrix(mod))$assign\r\n+  if (names(coefficients(mod)[1]) == "(Intercept)") {\r\n+    v <- v[-1, -1]\r\n+    assign <- assign[-1]\r\n+  } else warning("No intercept: vifs may not be sensible.")\r\n+  terms <- labels(terms(mod))\r\n+  n_terms <- length(terms)\r\n+  if (n_terms < 2) stop("The model contains fewer than 2 terms")\r\n+  if (length(assign) > dim(v)[1]) {\r\n+     diag(tmp_cor) <- 0\r\n+     if (any(tmp_cor == 1.0)) {\r\n+        return("Sample size is too small, 100% collinearity is present")\r\n+     } else {\r\n+        return("Sample size is too small")\r\n+     }\r\n+  }\r\n+  r <- cov2cor(v)\r\n+  detr <- det(r)\r\n+  result <- matrix(0, n_terms, 3)\r\n+  rownames(result) <- terms\r\n+  colnames(result) <- c("GVIF", "Df", "GVIF^(1/2Df)")\r\n+  for (term in 1:n_terms) {\r\n+    subs <- which(assign == term)\r\n+    result[term, 1] <- det(as.matrix(r[subs, subs])) * det(as.matrix(r[-subs, -subs])) / detr\r\n+    result[term, 2] <- length(subs)\r\n+  }\r\n+  if (all(result[, 2] == 1)) {\r\n+    result <- data.frame(GVIF = result[, 1])\r\n+  } else {\r\n+    result[, 3] <- result[, 1] ^ (1 / (2 * result[, 2]))\r\n+  }\r\n+  invisible(result)\r\n+}\r\n+corvif1 <- function(dataz) {\r\n+    dataz <- as.data.frame(dataz)\r\n+    #correlation part\r\n+    tmp_cor <- cor(dataz, use = "complete.obs")\r\n+    return(tmp_cor)\r\n+}\r\n+corvif2 <- function(dataz) {\r\n+    dataz <- as.data.frame(dataz)\r\n+    #vif part\r\n+    form    <- formula(paste("fooy ~ ", paste(strsplit(names(dataz), " "), collapse = " + ")))\r\n+    dataz   <- data.frame(fooy = 1, dataz)\r\n+    lm_mod  <- lm(form, dataz)\r\n+\r\n+    return(myvif(lm_mod))\r\n+}\r\n+\r\n+#Autocorrelation\r\n+if (auto) {\r\n+obj1 <- acf_tb(data, var = colvar)\r\n+obj2 <- acf_df(data, var = colvar)\r\n+autocorr(var1 = obj1, var2 = obj2)\r\n+}\r\n+\r\n+if (interr) {\r\n+#Interractions\r\n+mult1 <- ifelse(length(unique(data[, colspe])) <= 6, FALSE, TRUE)\r\n+interraction(data, var1 = colvar, var2 = colvar2, var3 = colspe, var4 = colvar4)\r\n+}\r\n+\r\n+#Collinearity\r\n+if (colli) {\r\n+mult2 <- ifelse(length(unique(data[, spe])) < 3, FALSE, TRUE)\r\n+coli(data = data_num, var = spe)\r\n+}\r\n+\r\n+#PCA\r\n+if (pca) {\r\n+active_data <- function(data) {\r\n+  #Calcul of PCA for the active data\r\n+  res_pca <- FactoMineR::PCA(data, graph = FALSE)\r\n+\r\n+return(res_pca)\r\n+}\r\n+\r\n+#eigenvalue\r\n+eig_val <- capture.output(factoextra::get_eigenvalue(active_data(data_active)))\r\n+\r\n+cat("\\nwrite table with eigenvalue. \\n--> \\"", paste(eig_val, "\\"\\n", sep = ""), file = "valeurs.txt", sep = "", append = TRUE)\r\n+\r\n+plot_pca(data_active)\r\n+plot_qual(data_active)\r\n+}\r\n+\r\n+#VIF\r\n+if (vif) {\r\n+#Compute 2 tables#\r\n+tb_corr <- as.data.frame(corvif1(dataz = data_active))\r\n+tb_corr <- cbind(x = rownames(tb_corr), tb_corr)\r\n+tb_vif <- corvif2(dataz = data_active)\r\n+\r\n+write.table(tb_corr, "corr.tabular", row.names = FALSE, quote = FALSE, sep = "\\t", dec = ".", fileEncoding = "UTF-8")\r\n+\r\n+if (all(is.na(tb_vif))) {\r\n+  tb_vif <- NULL\r\n+  cat("Vif couldn\'t be calculated, selected data isn\'t correlated")\r\n+}else{\r\n+write.table(tb_vif, "vif.tabular", row.names = FALSE, quote = FALSE, sep = "\\t", dec = ".", fileEncoding = "UTF-8")\r\n+}\r\n+}\r\n'
b
diff -r 000000000000 -r 726a387cfdc2 graph_pres_abs_abund.r
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graph_pres_abs_abund.r Fri Aug 13 18:17:11 2021 +0000
[
@@ -0,0 +1,195 @@
+#Rscript
+
+#########################################################
+##    Presence abscence and abundance in environment   ##
+#########################################################
+
+#####Packages : ggplot2
+#               vegan
+
+#####Load arguments
+
+args <- commandArgs(trailingOnly = TRUE)
+
+if (length(args) < 5) {
+    stop("This tool needs at least 5 arguments")
+}else{
+    table <- args[1]
+    hr <- args[2]
+    abundance <- as.logical(args[3])
+    presabs <- as.logical(args[4])
+    rarefaction <- as.logical(args[5])
+    lat <- as.numeric(args[6])
+    long <- as.numeric(args[7])
+    ind <- as.character(args[8])
+    loc <- as.numeric(args[9])
+    num <- as.character(args[10])
+    spe <- as.numeric(args[11])
+    abond <- as.numeric(args[12])
+}
+
+if (hr == "false") {
+  hr <- FALSE
+}else{
+  hr <- TRUE
+}
+
+#####Import data
+data <- read.table(table, sep = "\t", dec = ".", header = hr, fill = TRUE, encoding = "UTF-8")
+
+if (abundance) {
+collat <- colnames(data)[lat]
+collong <- colnames(data)[long]
+}
+
+if (presabs) {
+colloc <- colnames(data)[loc]
+}
+
+if (presabs | rarefaction | abundance) {
+colabond <- colnames(data)[abond]
+colspe <- colnames(data)[spe]
+data <- data[grep("^$", data[, colspe], invert = TRUE), ]
+}
+
+#####Your analysis
+
+####The abundance in the environment####
+
+##Representation of the environment##
+
+## Mapping
+graph_map <- function(data, collong, collat, colabond, ind, colspe) {
+  cat("\nCoordinates range\n\nLatitude from ", min(data[, collat], na.rm = TRUE), " to ", max(data[, collat], na.rm = TRUE), "\nLongitude from ", min(data[, collong], na.rm = TRUE), " to ", max(data[, collong], na.rm = TRUE), file = "Data_abund.txt", fill = 1, append = TRUE)
+  if (mult0) {
+    mappy <- ggplot2::ggplot(data, ggplot2::aes_string(x = collong, y = collat, cex = colabond, color = colspe)) +
+    ggplot2::geom_point() + ggplot2::ggtitle(paste("Abundance of", ind, "in the environment")) + ggplot2::xlab("Longitude") + ggplot2::ylab("Latitude")  + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 90, vjust = 0.5, hjust = 1), legend.text = ggplot2::element_text(size = 8)) + ggplot2::guides(cex = ggplot2::guide_legend(reverse = TRUE))
+
+  }else{
+    mappy <- ggplot2::ggplot(data, ggplot2::aes_string(x = collong, y = collat, cex = colabond, color = colabond)) +
+    ggplot2::geom_point() + ggplot2::ggtitle(paste("Abundance of", ind, "in the environment")) + ggplot2::xlab("Longitude") + ggplot2::ylab("Latitude")  + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 90, vjust = 0.5, hjust = 1), legend.text = ggplot2::element_text(size = 8)) + ggplot2::guides(cex = ggplot2::guide_legend(reverse = TRUE))
+  }
+  ggplot2::ggsave("mappy.png", mappy, width = 20, height = 9, units = "cm")
+}
+
+####Presence absence abundance####
+
+## Histogram
+graph_hist <- function(data, col1, col2, col3) {
+  cat("\nLocations\n", unique(data[, col1]), file = "Locations.txt", fill = 1, append = TRUE)
+  if (mult1) {
+    for (loc in unique(data[, col1])) {
+      data_cut <- data[data[, col1] == loc, ]
+      data_cut <- data_cut[data_cut[, col3] > 0, ]
+      if (length(unique(data_cut[, col2])) <= 40) {
+        top <- nrow(data_cut)
+        var <- nchar(as.character(round(top * 0.1, digits = 0)))
+        step <- round(top * 0.1, digits = ifelse(var == 1, 1, -var + 1))
+        graph <- ggplot2::ggplot(data_cut) +
+        ggplot2::geom_bar(ggplot2::aes_string(x = col1, fill = col2)) +
+        ggplot2::scale_y_continuous(breaks = seq(from = 0, to = top, by = step)) +
+        ggplot2::theme(plot.title = ggplot2::element_text(color = "black", size = 12, face = "bold")) +
+        ggplot2::ggtitle("Number of presence")
+
+        ggplot2::ggsave(paste("number_in_", loc, ".png"), graph)
+      }else{
+        cat(paste0("\n", loc, " had more than 40 species and plot isn't readable please select a higher taxon level or cut your data"))
+      }
+    }
+  }else{
+  top <- nrow(data)
+  var <- nchar(as.character(round(top * 0.1, digits = 0)))
+  step <- round(top * 0.1, digits = ifelse(var == 1, 1, -var + 1))
+  graph <- ggplot2::ggplot(data) +
+  ggplot2::geom_bar(ggplot2::aes_string(x = col1, fill = col2)) +
+  ggplot2::scale_y_continuous(breaks = seq(from = 0, to = top, by = step)) +
+  ggplot2::theme(plot.title = ggplot2::element_text(color = "black", size = 12, face = "bold")) +
+  ggplot2::ggtitle("Number of individuals")
+
+  ggplot2::ggsave("number.png", graph)
+  }
+}
+
+rare <- function(data, spe, abond, rare, num) {
+# Put the data in form
+  new_data <- as.data.frame(data[, spe])
+  colnames(new_data) <- c("Species")
+  new_data$total <- data[, abond]
+
+  new_data$rarefaction <- as.integer(rare)
+
+  end <- length(unique(new_data$Species))
+  out <- vegan::rarecurve(new_data[, 2:3], step = 10, sample = rarefy_sample, label = FALSE)
+  names(out) <- paste(unique(new_data$Species), sep = "")
+
+# Coerce data into "long" form.
+  protox <- mapply(FUN = function(x, y) {
+    mydf <- as.data.frame(x)
+    colnames(mydf) <- "value"
+    mydf$species <- y
+    mydf$subsample <- attr(x, "Subsample")
+    mydf <- na.omit(mydf)
+    mydf
+  }, x = out, y = as.list(names(out)), SIMPLIFY = FALSE)
+
+  xy <- do.call(rbind, protox)
+  rownames(xy) <- NULL  # pretty
+
+# Plot.
+
+  if (mult2) {
+    for (spe in unique(data[, spe])) {
+      xy_cut <- xy[xy$species == spe, ]
+      top <- max(xy_cut$subsample)
+      var <- nchar(as.character(round(top * 0.1, digits = 0)))
+      step <- round(top * 0.1, digits = ifelse(var == 1, 1, -var + 1))
+      courbe <- ggplot2::ggplot(xy_cut, ggplot2::aes(x = subsample, y = value)) +
+      ggplot2::theme_gray() +
+      ggplot2::geom_line(size = 1) +
+      ggplot2::scale_x_continuous(breaks = seq(from = 0, to = top, by = step)) +
+      ggplot2::xlab("Abundance") + ggplot2::ylab("Value") +
+      ggplot2::ggtitle("rarefaction curve")
+
+      ggplot2::ggsave(paste("rarefaction_of_", spe, ".png"), courbe)
+    }
+  }else{
+    top <- max(xy$subsample)
+    var <- nchar(as.character(round(top * 0.1, digits = 0)))
+    step <- round(top * 0.1, digits = ifelse(var == 1, 1, -var + 1))
+    courbe <- ggplot2::ggplot(xy, ggplot2::aes(x = subsample, y = value, color = species)) +
+    ggplot2::theme_gray() +
+    ggplot2::geom_line(size = 1) +
+    ggplot2::scale_x_continuous(breaks = seq(from = 0, to = top, by = step)) +
+    ggplot2::xlab("Subsample") + ggplot2::ylab("Value") +
+    ggplot2::ggtitle("rarefaction curves")
+
+    ggplot2::ggsave("rarefaction.png", courbe)
+  }
+}
+
+if (abundance) {
+#Maps
+mult0 <- ifelse(length(unique(data[, colspe])) > 10, FALSE, TRUE)
+graph_map(data, collong = collong, collat = collat, colabond = colabond, ind = ind, colspe = colspe)
+}
+
+if (presabs) {
+#Presence absence count
+mult1 <- ifelse(length(unique(data[, colloc])) <= 10, FALSE, TRUE)
+graph_hist(data, col1 = colloc, col2 = colspe, col3 = colabond)
+}
+
+if (rarefaction) {
+#rarefaction
+
+#### rarefaction indice ####
+rarefy_sample <- as.numeric(num)
+
+## Calcul de la rarefaction
+rarefaction <- vegan::rarefy(data[, abond], rarefy_sample)
+
+write.table(rarefaction, "rare.tabular")
+
+mult2 <- ifelse(length(unique(data[, colspe])) <= 30, FALSE, TRUE)
+rare(data, spe = colspe, abond = colabond, rare = rarefaction, num = rarefy_sample)
+}
b
diff -r 000000000000 -r 726a387cfdc2 graph_stat_presence_abs.r
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graph_stat_presence_abs.r Fri Aug 13 18:17:11 2021 +0000
[
@@ -0,0 +1,105 @@
+#Rscript
+
+################################
+##    Median and dispersion   ##
+################################
+
+#####Packages : Cowplot
+#               ggplot2
+
+#####Load arguments
+
+args <- commandArgs(trailingOnly = TRUE)
+
+if (length(args) == 0) {
+    stop("This tool needs at least one argument")
+}else{
+    table <- args[1]
+    hr <- args[2]
+    var <- as.numeric(args[3])
+    spe <- as.numeric(args[4])
+    loc <- as.numeric(args[5])
+    time <- as.numeric(args[6])
+    source(args[7])
+}
+
+if (hr == "false") {
+  hr <- FALSE
+}else{
+  hr <- TRUE
+}
+
+#####Import data
+data <- read.table(table, sep = "\t", dec = ".", header = hr, fill = TRUE, encoding = "UTF-8")
+data <- na.omit(data)
+colvar <- colnames(data)[var]
+colspe <- colnames(data)[spe]
+colloc <- colnames(data)[loc]
+coltime <- colnames(data)[time]
+
+data <- data[grep("^$", data[, spe], invert = TRUE), ]
+
+#####Your analysis
+
+####Median and data dispersion####
+
+#Median
+graph_median <- function(data, var) {
+  graph_median <- ggplot2::ggplot(data, ggplot2::aes_string(y = var)) +
+  ggplot2::geom_boxplot(color = "darkblue") +
+  ggplot2::theme(legend.position = "none") + ggplot2::ggtitle("Median")
+
+return(graph_median)
+
+}
+
+#Dispersion
+dispersion <- function(data, var, var2) {
+  graph_dispersion <- ggplot2::ggplot(data) +
+  ggplot2::geom_point(ggplot2::aes_string(x = var2, y = var, color = var2)) +
+  ggplot2::scale_fill_brewer(palette = "Set3") +
+  ggplot2::theme(legend.position = "none", axis.text.x = ggplot2::element_text(angle = 90, vjust = 0.5, hjust = 1), plot.title = ggplot2::element_text(color = "black", size = 12, face = "bold")) + ggplot2::ggtitle("Dispersion")
+
+return(graph_dispersion)
+
+}
+
+#The 2 graph
+med_disp <- function(med, disp) {
+  graph <- cowplot::plot_grid(med, disp, ncol = 1, nrow = 2, vjust = -5,  scales = "free")
+
+  ggplot2::ggsave("Med_Disp.png", graph, width = 12, height = 20, units = "cm")
+}
+
+
+#### Zero problem in data ####
+
+#Put data in form
+
+data_num <- make_table_analyse(data, colvar, colspe, colloc, coltime)
+nb_spe <- length(unique(data[, spe]))
+nb_col <- ncol(data_num) - nb_spe + 1
+data_num <- data_num[, nb_col:ncol(data_num)]
+
+#Presence of zeros in the data
+mat_corr <- function(data) {
+  cor(data)
+}
+p_mat <- function(data) {
+  ggcorrplot::cor_pmat(data)
+} # compute a matrix of correlation p-values
+
+graph_corr <- function(data_num) {
+  graph <- ggcorrplot::ggcorrplot(mat_corr(data_num), method = "circle", p.mat = p_mat(data_num), #barring the no significant coefficient
+  ggtheme = ggplot2::theme_gray, colors = c("#00AFBB", "#E7B800", "#FC4E07"))
+
+  ggplot2::ggsave("0_pb.png", graph)
+}
+
+##Med and disp
+med <- graph_median(data, var = colvar)
+disp <- dispersion(data, var = colvar, var2 = colspe)
+med_disp(med = med, disp = disp)
+
+##O problem
+graph_corr(data_num)
b
diff -r 000000000000 -r 726a387cfdc2 macro.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/macro.xml Fri Aug 13 18:17:11 2021 +0000
[
@@ -0,0 +1,65 @@
+<macros>
+    <token name="@VERSION@">0.0.0</token>
+    <xml name="Explo_requirements">
+        <requirements>
+           <requirement type="package" version="3.3.3">r-ggplot2</requirement>
+           <yield />
+        </requirements>
+    </xml>
+    <xml name="explo_input">
+       <param name="input" type="data" format="tabular" label="Input table"/>
+       <param name="colnames" type="boolean" label="First line is a header line" checked="true"/>
+    </xml>
+    <xml name="explo_filter_colli">
+        <filter> method['type'] == 'collinearity'</filter>
+    </xml>
+    <xml name="explo_filter_pca">
+        <filter> method['type'] == 'pca'</filter>
+    </xml>
+    <xml name="explo_filter_vif">
+        <filter> method['type'] == 'vif'</filter>
+    </xml>
+    <xml name="explo_filter_interr">
+        <filter> method['type'] == 'interr'</filter>
+    </xml>
+    <xml name="explo_filter_autocorr">
+        <filter> method['type'] == 'autocorr'</filter>
+    </xml>
+    <xml name="explo_filter_abund">
+        <filter> method['type'] == 'abund'</filter>
+    </xml>
+    <xml name="explo_filter_pres_abs">
+        <filter> method['type'] == 'pres_abs'</filter>
+    </xml>
+    <xml name="explo_filter_rare">
+        <filter> method['type'] == 'rare'</filter>
+    </xml>
+    <xml name="explo_bibref">
+       <citations>
+            <citation type="bibtex">
+            @unpublished{
+            title={ A protocol for data exploration to avoid common statistical problems },
+            authors={Alain F. Zuur,  Elena N. Ieno,  Chris S. Elphick},
+            url={https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.2041-210X.2009.00001.x}
+            }
+            </citation>
+        </citations>
+    </xml>
+    <xml name="book_bibref">
+        <citations>
+            <citation type="bibtex">
+            @unpublished{
+            title={ Numerical Ecology with R },
+            author={Daniel Borcard, François Gillet, Pierre Legendre},
+            }
+            </citation>
+        </citations>
+    </xml>
+    <xml name="topic">
+        <edam_topics>
+           <edam_topic>topic_0610</edam_topic>
+           <edam_topic>topic_3050</edam_topic>
+        </edam_topics>
+    </xml>
+</macros>
+
b
diff -r 000000000000 -r 726a387cfdc2 test-data/Data.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Data.tabular Fri Aug 13 18:17:11 2021 +0000
b
@@ -0,0 +1,2 @@
+"x"
+"1" 29
b
diff -r 000000000000 -r 726a387cfdc2 test-data/Missing_species.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Missing_species.txt Fri Aug 13 18:17:11 2021 +0000
b
@@ -0,0 +1,6 @@
+
+There is not enough data on these species they appear too few times in the tabular-file
+
+Scorpaenidae
+Plesiopidae
+Serranidae
b
diff -r 000000000000 -r 726a387cfdc2 test-data/Reel_life_survey_fish_modif.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Reel_life_survey_fish_modif.tabular Fri Aug 13 18:17:11 2021 +0000
[
b'@@ -0,0 +1,290 @@\n+FID\tKey\tSurveyID\tCountry\tEcoregion\tRealm\tSiteCode\tSite\tSiteLat\tSiteLong\tSurveyDate\tDepth\tPhylum\tClass\tFamily\tTaxon\tBlock\tTotal\tDiver\tgeom\n+M2_FISH_DATA.1\t1\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tBlenniidae\tEcsenius mandibularis\t2\t2\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.2\t2\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tBlenniidae\tEcsenius stictus\t1\t5\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.3\t3\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tBlenniidae\tEcsenius stictus\t2\t8\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.4\t4\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tGobiidae\tEviota guttata\t1\t6\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.5\t5\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tGobiidae\tEviota guttata\t2\t9\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.6\t6\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tGobiidae\tEviota hoesei\t1\t3\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.7\t7\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tGobiidae\tEviota hoesei\t2\t19\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.8\t8\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tGobiidae\tGobiodon histrio\t1\t1\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.9\t9\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tGobiidae\tGobiodon histrio\t2\t3\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.10\t10\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tGobiidae\tGobiodon sp. [3 GA]\t1\t12\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.11\t11\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tGobiidae\tGobiodon spp.\t2\t5\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.12\t12\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tScorpaenidae\tParascorpaena aurita\t2\t1\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.13\t13\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tTripterygiidae\tUcla xenogrammus\t1\t1\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.14\t14\t912347736\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6\tChordata\tActinopterygii\tTripterygiidae\tUcla xenogrammus\t2\t1\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.15\t15\t912347737\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T13:00:00Z\t6.1\tChordata\tActinopterygii\tPlesiopidae\tAssessor macneilli\t2\t20\tLVS\tPOINT (151.92 -23.18)\n+M2_FISH_DATA.16\t16\t912347737\tAustralia\tCentral and Southern Great Barrier Reef\tCentral Indo-Pacific\tAIMS12\tNorth Island Site 3\t-23.18\t151.92\t2017-02-13T1'..b'te Northern Atlantic\tAND8\tAlmeria puerto\t36.83\t-2.46\t2013-11-27T13:00:00Z\t1.8\tChordata\tActinopterygii\tBlenniidae\tParablennius pilicornis\t2\t5\tJASF\tPOINT (-2.46 36.83)\n+M2_FISH_DATA.272\t272\t912349134\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND8\tAlmeria puerto\t36.83\t-2.46\t2013-11-27T13:00:00Z\t1.8\tChordata\tActinopterygii\tScorpaenidae\tScorpaena porcus\t1\t1\tJASF\tPOINT (-2.46 36.83)\n+M2_FISH_DATA.273\t273\t912349134\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND8\tAlmeria puerto\t36.83\t-2.46\t2013-11-27T13:00:00Z\t1.8\tChordata\tActinopterygii\tScorpaenidae\tScorpaena porcus\t2\t1\tJASF\tPOINT (-2.46 36.83)\n+M2_FISH_DATA.274\t274\t912344582\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND9\tCamping\t36.82\t-2.51\t2014-07-14T14:00:00Z\t3\tChordata\tActinopterygii\tGobiidae\tGobius bucchichi\t1\t27\tJASF\tPOINT (-2.51 36.82)\n+M2_FISH_DATA.275\t275\t912344582\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND9\tCamping\t36.82\t-2.51\t2014-07-14T14:00:00Z\t3\tChordata\tActinopterygii\tGobiidae\tGobius bucchichi\t2\t27\tJASF\tPOINT (-2.51 36.82)\n+M2_FISH_DATA.276\t276\t912344582\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND9\tCamping\t36.82\t-2.51\t2014-07-14T14:00:00Z\t3\tChordata\tActinopterygii\tGobiesocidae\tLepadogaster candolii\t1\t1\tJASF\tPOINT (-2.51 36.82)\n+M2_FISH_DATA.277\t277\t912344582\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND9\tCamping\t36.82\t-2.51\t2014-07-14T14:00:00Z\t3\tChordata\tActinopterygii\tBlenniidae\tParablennius pilicornis\t1\t6\tJASF\tPOINT (-2.51 36.82)\n+M2_FISH_DATA.278\t278\t912344582\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND9\tCamping\t36.82\t-2.51\t2014-07-14T14:00:00Z\t3\tChordata\tActinopterygii\tBlenniidae\tParablennius pilicornis\t2\t14\tJASF\tPOINT (-2.51 36.82)\n+M2_FISH_DATA.279\t279\t912344582\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND9\tCamping\t36.82\t-2.51\t2014-07-14T14:00:00Z\t3\tChordata\tActinopterygii\tScorpaenidae\tScorpaena porcus\t1\t1\tJASF\tPOINT (-2.51 36.82)\n+M2_FISH_DATA.280\t280\t912344582\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND9\tCamping\t36.82\t-2.51\t2014-07-14T14:00:00Z\t3\tChordata\tActinopterygii\tTripterygiidae\tTripterygion delaisi\t1\t1\tJASF\tPOINT (-2.51 36.82)\n+M2_FISH_DATA.281\t281\t912349135\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND9\tCamping\t36.82\t-2.51\t2013-11-27T13:00:00Z\t2.4\tChordata\tActinopterygii\tGobiidae\tGobius bucchichi\t1\t3\tJASF\tPOINT (-2.51 36.82)\n+M2_FISH_DATA.282\t282\t912349135\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND9\tCamping\t36.82\t-2.51\t2013-11-27T13:00:00Z\t2.4\tChordata\tActinopterygii\tGobiidae\tGobius bucchichi\t2\t2\tJASF\tPOINT (-2.51 36.82)\n+M2_FISH_DATA.283\t283\t912349135\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND9\tCamping\t36.82\t-2.51\t2013-11-27T13:00:00Z\t2.4\tChordata\tActinopterygii\tBlenniidae\tParablennius pilicornis\t1\t4\tJASF\tPOINT (-2.51 36.82)\n+M2_FISH_DATA.284\t284\t912349135\tSpain\tAlboran Sea\tTemperate Northern Atlantic\tAND9\tCamping\t36.82\t-2.51\t2013-11-27T13:00:00Z\t2.4\tChordata\tActinopterygii\tBlenniidae\tParablennius pilicornis\t2\t6\tJASF\tPOINT (-2.51 36.82)\n+M2_FISH_DATA.285\t285\t912345928\tAntarctica\tAntarctic Peninsula\tSouthern Ocean\tANT4\tEnd Runway\t-67.57\t-68.13\t2016-01-05T13:00:00Z\t9\tChordata\tActinopterygii\tNototheniidae\tTrematomus hansoni\t1\t1\tSM\tPOINT (-68.13 -67.57)\n+M2_FISH_DATA.286\t286\t912346517\tAntarctica\tAntarctic Peninsula\tSouthern Ocean\tANT5\tWharf\t-67.57\t-68.13\t2016-01-06T13:00:00Z\t9\tChordata\tActinopterygii\tNototheniidae\tNotothenia coriiceps\t2\t1\tSM\tPOINT (-68.13 -67.57)\n+M2_FISH_DATA.287\t287\t912346517\tAntarctica\tAntarctic Peninsula\tSouthern Ocean\tANT5\tWharf\t-67.57\t-68.13\t2016-01-06T13:00:00Z\t9\tChordata\tActinopterygii\tNototheniidae\tTrematomus newnesi\t1\t1\tSM\tPOINT (-68.13 -67.57)\n+M2_FISH_DATA.288\t288\t912346518\tAntarctica\tAntarctic Peninsula\tSouthern Ocean\tANT7\tTrovall\t-67.6\t-68.21\t2016-02-11T13:00:00Z\t12\tChordata\tActinopterygii\tHarpagiferidae\tHarpagifer antarcticus\t1\t1\tSM\tPOINT (-68.21 -67.6)\n+M2_FISH_DATA.289\t289\t912346518\tAntarctica\tAntarctic Peninsula\tSouthern Ocean\tANT7\tTrovall\t-67.6\t-68.21\t2016-02-11T13:00:00Z\t12\tChordata\tActinopterygii\tNototheniidae\tNototheniid spp.\t2\t1\tSM\tPOINT (-68.21 -67.6)\n'
b
diff -r 000000000000 -r 726a387cfdc2 test-data/Reel_life_survey_fish_modif2.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Reel_life_survey_fish_modif2.tabular Fri Aug 13 18:17:11 2021 +0000
[
@@ -0,0 +1,30 @@
+FID Key SurveyID Country Ecoregion Realm SiteCode Site SiteLat SiteLong SurveyDate Depth Phylum Class Family Taxon Block Total Diver geom
+M2_FISH_DATA.1 1 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Blenniidae Ecsenius mandibularis 2 2 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.2 2 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Blenniidae Ecsenius stictus 1 5 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.3 3 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Blenniidae Ecsenius stictus 2 8 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.4 4 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Gobiidae Eviota guttata 1 6 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.5 5 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Gobiidae Eviota guttata 2 9 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.6 6 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Gobiidae Eviota hoesei 1 3 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.7 7 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Gobiidae Eviota hoesei 2 19 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.8 8 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Gobiidae Gobiodon histrio 1 1 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.9 9 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Gobiidae Gobiodon histrio 2 3 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.10 10 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Gobiidae Gobiodon sp. [3 GA] 1 12 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.11 11 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Gobiidae Gobiodon spp. 2 5 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.12 12 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Scorpaenidae Parascorpaena aurita 2 1 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.13 13 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Tripterygiidae Ucla xenogrammus 1 1 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.14 14 912347736 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6 Chordata Actinopterygii Tripterygiidae Ucla xenogrammus 2 1 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.15 15 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Plesiopidae Assessor macneilli 2 20 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.16 16 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Blenniidae Ecsenius bicolor 1 4 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.17 17 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Blenniidae Ecsenius bicolor 2 1 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.18 18 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Blenniidae Ecsenius mandibularis 1 5 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.19 19 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Blenniidae Ecsenius mandibularis 2 6 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.20 20 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Blenniidae Ecsenius stictus 1 1 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.21 21 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Blenniidae Ecsenius stictus 2 3 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.22 22 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Tripterygiidae Enneapterygius similis 1 3 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.23 23 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Serranidae Epinephelus fasciatus 2 1 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.24 24 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Gobiidae Eviota guttata 1 6 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.25 25 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Gobiidae Eviota guttata 2 8 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.26 26 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Gobiidae Eviota hoesei 1 7 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.27 27 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Gobiidae Eviota hoesei 2 12 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.28 28 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Gobiidae Gobiodon sp. [3 GA] 2 16 LVS POINT (151.92 -23.18)
+M2_FISH_DATA.29 29 912347737 Australia Central and Southern Great Barrier Reef Central Indo-Pacific AIMS12 North Island Site 3 -23.18 151.92 2017-02-13T13:00:00Z 6.1 Chordata Actinopterygii Gobiidae Gobiodon spp. 2 7 LVS POINT (151.92 -23.18)
b
diff -r 000000000000 -r 726a387cfdc2 test-data/SCBD.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/SCBD.txt Fri Aug 13 18:17:11 2021 +0000
b
@@ -0,0 +1,4 @@
+    Blenniidae       Gobiidae   Scorpaenidae Tripterygiidae    Plesiopidae 
+    0.13452280     0.12622864     0.05950360     0.15163110     0.07035376 
+    Apogonidae  Nototheniidae 
+    0.06153987     0.14519360 
b
diff -r 000000000000 -r 726a387cfdc2 test-data/data_frenchbbs.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/data_frenchbbs.tabular Fri Aug 13 18:17:11 2021 +0000
b
b'@@ -0,0 +1,851 @@\n+"carre"\t"annee"\t"espece"\t"abond"\r\n+"440072"\t2014\t"ALAARV"\t4\r\n+"440072"\t2014\t"PARCAE"\t5\r\n+"440168"\t2014\t"ALAARV"\t1\r\n+"440168"\t2014\t"PARCAE"\t10\r\n+"440168"\t2017\t"ALAARV"\t2\r\n+"440168"\t2017\t"PARCAE"\t12\r\n+"440168"\t2018\t"ALAARV"\t2\r\n+"440168"\t2018\t"PARCAE"\t20\r\n+"440211"\t2014\t"ALAARV"\t10\r\n+"440211"\t2014\t"PARCAE"\t5\r\n+"440211"\t2015\t"ALAARV"\t11\r\n+"440211"\t2015\t"PARCAE"\t6\r\n+"440211"\t2016\t"ALAARV"\t11\r\n+"440211"\t2016\t"PARCAE"\t2\r\n+"440211"\t2017\t"ALAARV"\t9\r\n+"440211"\t2017\t"PARCAE"\t2\r\n+"440211"\t2018\t"ALAARV"\t10\r\n+"440211"\t2018\t"PARCAE"\t8\r\n+"440235"\t2005\t"ALAARV"\t3\r\n+"440235"\t2005\t"PARCAE"\t15\r\n+"440235"\t2006\t"ALAARV"\t6\r\n+"440235"\t2006\t"PARCAE"\t12\r\n+"440235"\t2007\t"ALAARV"\t1\r\n+"440235"\t2007\t"PARCAE"\t10\r\n+"440235"\t2008\t"ALAARV"\t1\r\n+"440235"\t2008\t"PARCAE"\t12\r\n+"440235"\t2009\t"ALAARV"\t0\r\n+"440235"\t2009\t"PARCAE"\t13\r\n+"440278"\t2008\t"ALAARV"\t7\r\n+"440278"\t2008\t"PARCAE"\t7\r\n+"440278"\t2009\t"ALAARV"\t8\r\n+"440278"\t2009\t"PARCAE"\t14\r\n+"440278"\t2010\t"ALAARV"\t7\r\n+"440278"\t2010\t"PARCAE"\t5\r\n+"440278"\t2011\t"ALAARV"\t8\r\n+"440278"\t2011\t"PARCAE"\t7\r\n+"440278"\t2012\t"ALAARV"\t7\r\n+"440278"\t2012\t"PARCAE"\t8\r\n+"440278"\t2013\t"ALAARV"\t10\r\n+"440278"\t2013\t"PARCAE"\t8\r\n+"440278"\t2014\t"ALAARV"\t6\r\n+"440278"\t2014\t"PARCAE"\t7\r\n+"440278"\t2015\t"ALAARV"\t7\r\n+"440278"\t2015\t"PARCAE"\t7\r\n+"440278"\t2016\t"ALAARV"\t7\r\n+"440278"\t2016\t"PARCAE"\t7\r\n+"440278"\t2017\t"ALAARV"\t6\r\n+"440278"\t2017\t"PARCAE"\t2\r\n+"440278"\t2018\t"ALAARV"\t7\r\n+"440278"\t2018\t"PARCAE"\t7\r\n+"440310"\t2011\t"ALAARV"\t12\r\n+"440310"\t2011\t"PARCAE"\t5\r\n+"440310"\t2012\t"ALAARV"\t15\r\n+"440310"\t2012\t"PARCAE"\t13\r\n+"440310"\t2013\t"ALAARV"\t26\r\n+"440310"\t2013\t"PARCAE"\t12\r\n+"440310"\t2014\t"ALAARV"\t14\r\n+"440310"\t2014\t"PARCAE"\t8\r\n+"440310"\t2015\t"ALAARV"\t11\r\n+"440310"\t2015\t"PARCAE"\t8\r\n+"440310"\t2016\t"ALAARV"\t14\r\n+"440310"\t2016\t"PARCAE"\t10\r\n+"440310"\t2017\t"ALAARV"\t13\r\n+"440310"\t2017\t"PARCAE"\t12\r\n+"440310"\t2018\t"ALAARV"\t12\r\n+"440310"\t2018\t"PARCAE"\t11\r\n+"440398"\t2012\t"ALAARV"\t2\r\n+"440398"\t2012\t"PARCAE"\t2\r\n+"440398"\t2013\t"ALAARV"\t2\r\n+"440398"\t2013\t"PARCAE"\t2\r\n+"440398"\t2014\t"ALAARV"\t4\r\n+"440398"\t2014\t"PARCAE"\t6\r\n+"440411"\t2004\t"ALAARV"\t16\r\n+"440411"\t2004\t"PARCAE"\t5\r\n+"440411"\t2005\t"ALAARV"\t14\r\n+"440411"\t2005\t"PARCAE"\t8\r\n+"440411"\t2006\t"ALAARV"\t18\r\n+"440411"\t2006\t"PARCAE"\t10\r\n+"440411"\t2007\t"ALAARV"\t15\r\n+"440411"\t2007\t"PARCAE"\t7\r\n+"440411"\t2008\t"ALAARV"\t12\r\n+"440411"\t2008\t"PARCAE"\t9\r\n+"440411"\t2009\t"ALAARV"\t11\r\n+"440411"\t2009\t"PARCAE"\t5\r\n+"440411"\t2010\t"ALAARV"\t11\r\n+"440411"\t2010\t"PARCAE"\t2\r\n+"440411"\t2011\t"ALAARV"\t16\r\n+"440411"\t2011\t"PARCAE"\t5\r\n+"440411"\t2012\t"ALAARV"\t18\r\n+"440411"\t2012\t"PARCAE"\t2\r\n+"440411"\t2013\t"ALAARV"\t14\r\n+"440411"\t2013\t"PARCAE"\t11\r\n+"440411"\t2014\t"ALAARV"\t15\r\n+"440411"\t2014\t"PARCAE"\t9\r\n+"440411"\t2015\t"ALAARV"\t16\r\n+"440411"\t2015\t"PARCAE"\t3\r\n+"440411"\t2016\t"ALAARV"\t9\r\n+"440411"\t2016\t"PARCAE"\t3\r\n+"440411"\t2017\t"ALAARV"\t14\r\n+"440411"\t2017\t"PARCAE"\t13\r\n+"440411"\t2018\t"ALAARV"\t12\r\n+"440411"\t2018\t"PARCAE"\t6\r\n+"440430"\t2006\t"ALAARV"\t0\r\n+"440430"\t2006\t"PARCAE"\t5\r\n+"440430"\t2007\t"ALAARV"\t0\r\n+"440430"\t2007\t"PARCAE"\t4\r\n+"440430"\t2008\t"ALAARV"\t0\r\n+"440430"\t2008\t"PARCAE"\t7\r\n+"440430"\t2010\t"ALAARV"\t0\r\n+"440430"\t2010\t"PARCAE"\t3\r\n+"440430"\t2012\t"ALAARV"\t0\r\n+"440430"\t2012\t"PARCAE"\t2\r\n+"440430"\t2014\t"ALAARV"\t0\r\n+"440430"\t2014\t"PARCAE"\t3\r\n+"440456"\t2001\t"ALAARV"\t3\r\n+"440456"\t2001\t"PARCAE"\t10\r\n+"440456"\t2002\t"ALAARV"\t4\r\n+"440456"\t2002\t"PARCAE"\t11\r\n+"440456"\t2003\t"ALAARV"\t4\r\n+"440456"\t2003\t"PARCAE"\t14\r\n+"440456"\t2004\t"ALAARV"\t6\r\n+"440456"\t2004\t"PARCAE"\t16\r\n+"440456"\t2005\t"ALAARV"\t6\r\n+"440456"\t2005\t"PARCAE"\t13\r\n+"440456"\t2006\t"ALAARV"\t4\r\n+"440456"\t2006\t"PARCAE"\t9\r\n+"440456"\t2007\t"ALAARV"\t5\r\n+"440456"\t2007\t"PARCAE"\t11\r\n+"440456"\t2008\t"ALAARV"\t2\r\n+"440456"\t2008\t"PARCAE"\t8\r\n+"440456"\t2009\t"ALAARV"\t4\r\n+"440456"\t2009\t"PARCAE"\t10\r\n+"440456"\t2010\t"ALAARV"\t2\r\n+"440456"\t2010\t"PARCAE"\t15\r\n+"440456"\t2011\t"ALAARV"\t4\r\n+"440456"\t2011\t"PARCAE"\t14\r\n+"440456"\t2012\t"ALAARV"\t0\r\n+"440456"\t2012\t"PARCAE"\t11\r\n+"440456"\t2014\t"ALAARV"\t2\r\n+"440456"\t2014\t"PARCAE"\t12\r\n+"440462"\t2001\t"ALAARV"\t3\r\n+"440462"\t2001\t"PARCAE"\t3\r\n+"440462"\t2002\t"ALAARV"\t6\r\n+"440462"\t2002\t"PARCAE"\t5\r\n+"4'..b'07\t"PARCAE"\t6\r\n+"441242"\t2008\t"ALAARV"\t0\r\n+"441242"\t2008\t"PARCAE"\t8\r\n+"441242"\t2009\t"ALAARV"\t0\r\n+"441242"\t2009\t"PARCAE"\t7\r\n+"441242"\t2010\t"ALAARV"\t0\r\n+"441242"\t2010\t"PARCAE"\t3\r\n+"441242"\t2011\t"ALAARV"\t0\r\n+"441242"\t2011\t"PARCAE"\t6\r\n+"441242"\t2012\t"ALAARV"\t0\r\n+"441242"\t2012\t"PARCAE"\t9\r\n+"441242"\t2013\t"ALAARV"\t0\r\n+"441242"\t2013\t"PARCAE"\t9\r\n+"441242"\t2014\t"ALAARV"\t0\r\n+"441242"\t2014\t"PARCAE"\t10\r\n+"441242"\t2015\t"ALAARV"\t0\r\n+"441242"\t2015\t"PARCAE"\t9\r\n+"441242"\t2016\t"ALAARV"\t0\r\n+"441242"\t2016\t"PARCAE"\t5\r\n+"441242"\t2017\t"ALAARV"\t0\r\n+"441242"\t2017\t"PARCAE"\t5\r\n+"441242"\t2018\t"ALAARV"\t0\r\n+"441242"\t2018\t"PARCAE"\t4\r\n+"441259"\t2018\t"ALAARV"\t2\r\n+"441259"\t2018\t"PARCAE"\t14\r\n+"441265"\t2004\t"ALAARV"\t2\r\n+"441265"\t2004\t"PARCAE"\t6\r\n+"441265"\t2005\t"ALAARV"\t2\r\n+"441265"\t2005\t"PARCAE"\t3\r\n+"441265"\t2006\t"ALAARV"\t2\r\n+"441265"\t2006\t"PARCAE"\t0\r\n+"441265"\t2007\t"ALAARV"\t0\r\n+"441265"\t2007\t"PARCAE"\t4\r\n+"441265"\t2008\t"ALAARV"\t1\r\n+"441265"\t2008\t"PARCAE"\t7\r\n+"441265"\t2009\t"ALAARV"\t1\r\n+"441265"\t2009\t"PARCAE"\t4\r\n+"441265"\t2010\t"ALAARV"\t1\r\n+"441265"\t2010\t"PARCAE"\t2\r\n+"441265"\t2011\t"ALAARV"\t2\r\n+"441265"\t2011\t"PARCAE"\t13\r\n+"441265"\t2012\t"ALAARV"\t0\r\n+"441265"\t2012\t"PARCAE"\t5\r\n+"441265"\t2013\t"ALAARV"\t1\r\n+"441265"\t2013\t"PARCAE"\t4\r\n+"441307"\t2016\t"ALAARV"\t2\r\n+"441307"\t2016\t"PARCAE"\t10\r\n+"441307"\t2017\t"ALAARV"\t2\r\n+"441307"\t2017\t"PARCAE"\t3\r\n+"441307"\t2018\t"ALAARV"\t1\r\n+"441307"\t2018\t"PARCAE"\t6\r\n+"441311"\t2015\t"ALAARV"\t0\r\n+"441311"\t2015\t"PARCAE"\t12\r\n+"441311"\t2016\t"ALAARV"\t0\r\n+"441311"\t2016\t"PARCAE"\t6\r\n+"441311"\t2017\t"ALAARV"\t0\r\n+"441311"\t2017\t"PARCAE"\t6\r\n+"441311"\t2018\t"ALAARV"\t0\r\n+"441311"\t2018\t"PARCAE"\t15\r\n+"441340"\t2004\t"ALAARV"\t0\r\n+"441340"\t2004\t"PARCAE"\t10\r\n+"441340"\t2005\t"ALAARV"\t0\r\n+"441340"\t2005\t"PARCAE"\t10\r\n+"441340"\t2006\t"ALAARV"\t0\r\n+"441340"\t2006\t"PARCAE"\t8\r\n+"441340"\t2007\t"ALAARV"\t0\r\n+"441340"\t2007\t"PARCAE"\t7\r\n+"441340"\t2008\t"ALAARV"\t0\r\n+"441340"\t2008\t"PARCAE"\t6\r\n+"441340"\t2009\t"ALAARV"\t0\r\n+"441340"\t2009\t"PARCAE"\t7\r\n+"441340"\t2010\t"ALAARV"\t0\r\n+"441340"\t2010\t"PARCAE"\t2\r\n+"441340"\t2011\t"ALAARV"\t0\r\n+"441340"\t2011\t"PARCAE"\t6\r\n+"441340"\t2012\t"ALAARV"\t0\r\n+"441340"\t2012\t"PARCAE"\t6\r\n+"441340"\t2013\t"ALAARV"\t0\r\n+"441340"\t2013\t"PARCAE"\t7\r\n+"441340"\t2014\t"ALAARV"\t0\r\n+"441340"\t2014\t"PARCAE"\t6\r\n+"441340"\t2015\t"ALAARV"\t0\r\n+"441340"\t2015\t"PARCAE"\t5\r\n+"441376"\t2014\t"ALAARV"\t0\r\n+"441376"\t2014\t"PARCAE"\t15\r\n+"441376"\t2015\t"ALAARV"\t0\r\n+"441376"\t2015\t"PARCAE"\t10\r\n+"441376"\t2016\t"ALAARV"\t0\r\n+"441376"\t2016\t"PARCAE"\t7\r\n+"441376"\t2017\t"ALAARV"\t0\r\n+"441376"\t2017\t"PARCAE"\t13\r\n+"441376"\t2018\t"ALAARV"\t0\r\n+"441376"\t2018\t"PARCAE"\t18\r\n+"441558"\t2001\t"ALAARV"\t2\r\n+"441558"\t2001\t"PARCAE"\t6\r\n+"441558"\t2002\t"ALAARV"\t1\r\n+"441558"\t2002\t"PARCAE"\t0\r\n+"441558"\t2003\t"ALAARV"\t1\r\n+"441558"\t2003\t"PARCAE"\t0\r\n+"441558"\t2004\t"ALAARV"\t2\r\n+"441558"\t2004\t"PARCAE"\t3\r\n+"441558"\t2005\t"ALAARV"\t1\r\n+"441558"\t2005\t"PARCAE"\t1\r\n+"441558"\t2006\t"ALAARV"\t1\r\n+"441558"\t2006\t"PARCAE"\t3\r\n+"441558"\t2007\t"ALAARV"\t2\r\n+"441558"\t2007\t"PARCAE"\t4\r\n+"441558"\t2008\t"ALAARV"\t1\r\n+"441558"\t2008\t"PARCAE"\t4\r\n+"441558"\t2009\t"ALAARV"\t1\r\n+"441558"\t2009\t"PARCAE"\t5\r\n+"441558"\t2011\t"ALAARV"\t1\r\n+"441558"\t2011\t"PARCAE"\t0\r\n+"441558"\t2012\t"ALAARV"\t0\r\n+"441558"\t2012\t"PARCAE"\t1\r\n+"441594"\t2004\t"ALAARV"\t12\r\n+"441594"\t2004\t"PARCAE"\t3\r\n+"441594"\t2005\t"ALAARV"\t9\r\n+"441594"\t2005\t"PARCAE"\t3\r\n+"441594"\t2006\t"ALAARV"\t10\r\n+"441594"\t2006\t"PARCAE"\t1\r\n+"441594"\t2007\t"ALAARV"\t5\r\n+"441594"\t2007\t"PARCAE"\t3\r\n+"441594"\t2008\t"ALAARV"\t6\r\n+"441594"\t2008\t"PARCAE"\t6\r\n+"441594"\t2009\t"ALAARV"\t1\r\n+"441594"\t2009\t"PARCAE"\t5\r\n+"441640"\t2012\t"ALAARV"\t12\r\n+"441640"\t2012\t"PARCAE"\t4\r\n+"441680"\t2012\t"ALAARV"\t2\r\n+"441680"\t2012\t"PARCAE"\t4\r\n+"441680"\t2013\t"ALAARV"\t1\r\n+"441680"\t2013\t"PARCAE"\t7\r\n+"441680"\t2014\t"ALAARV"\t0\r\n+"441680"\t2014\t"PARCAE"\t7\r\n+"441680"\t2015\t"ALAARV"\t1\r\n+"441680"\t2015\t"PARCAE"\t5\r\n+"441680"\t2016\t"ALAARV"\t0\r\n+"441680"\t2016\t"PARCAE"\t2\r\n+"441680"\t2017\t"ALAARV"\t0\r\n+"441680"\t2017\t"PARCAE"\t5\r\n+"441680"\t2018\t"ALAARV"\t0\r\n+"441680"\t2018\t"PARCAE"\t7\r\n+"Ile de"\t2018\t"ALAARV"\t3\r\n+"Ile de"\t2018\t"PARCAE"\t7\r\n+"Le Mas"\t2018\t"ALAARV"\t0\r\n+"Le Mas"\t2018\t"PARCAE"\t7\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 726a387cfdc2 test-data/levene.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/levene.txt Fri Aug 13 18:17:11 2021 +0000
b
@@ -0,0 +1,8 @@
+
+write table with levene test. 
+--> "Levene's Test for Homogeneity of Variance (center = median)"
+       Df F value    Pr(>F)    "
+group   1   22.02 3.145e-06 ***"
+      848                      "
+---"
+Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
b
diff -r 000000000000 -r 726a387cfdc2 test-data/species.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/species.txt Fri Aug 13 18:17:11 2021 +0000
b
@@ -0,0 +1,6 @@
+Blenniidae
+Gobiidae
+Scorpaenidae
+Tripterygiidae
+Plesiopidae
+Serranidae
b
diff -r 000000000000 -r 726a387cfdc2 test-data/test_bbs2.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/test_bbs2.txt Fri Aug 13 18:17:11 2021 +0000
b
@@ -0,0 +1,8 @@
+
+write table with levene test. 
+--> "Levene's Test for Homogeneity of Variance (center = median)"
+       Df F value    Pr(>F)    "
+group   1   22.02 3.145e-06 ***"
+      848                      "
+---"
+Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
b
diff -r 000000000000 -r 726a387cfdc2 test-data/test_fish2.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/test_fish2.tabular Fri Aug 13 18:17:11 2021 +0000
b
@@ -0,0 +1,2 @@
+"x"
+"1" 6
b
diff -r 000000000000 -r 726a387cfdc2 test-data/test_value_fish2.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/test_value_fish2.txt Fri Aug 13 18:17:11 2021 +0000
b
@@ -0,0 +1,10 @@
+
+write table with eigenvalue. 
+--> "        eigenvalue variance.percent cumulative.variance.percent"
+Dim.1 2.849961e+00     5.699922e+01                    56.99922"
+Dim.2 1.229238e+00     2.458475e+01                    81.58397"
+Dim.3 7.482796e-01     1.496559e+01                    96.54956"
+Dim.4 1.725220e-01     3.450440e+00                   100.00000"
+Dim.5 1.948918e-14     3.897836e-13                   100.00000"
+Dim.6 9.545002e-34     1.909000e-32                   100.00000"
+Dim.7 2.137718e-35     4.275436e-34                   100.00000"