分类: R语言

  • 利用HMP文件遗传相似度

    【功能】

    利用HMP文件计算遗传相似度(genetic_similarity)。

    数据中不能有NA。

    【鸣谢】

    四川农业大学 瞿静涛 算法思路

    黑龙江农科院 曹士亮 测试

    【更新历史】

    2020年8月17日

    • 增加了国内线路。

    2020年5月6日

    • 更换了计算逻辑,计算更快,但数据中不能有NA。

    2020年4月18日

    • 增加了自动去掉None数据的功能,避免程序出错。
    • 结果自动命名为【原文件名_性状名】的形式。

    【使用方法】

    在Rstudio中运行下列代码。

    海外:


    source("https://aozhangchina.github.io/R/genetic_similarity/genetic_similarity.r")   # 加载程序文件,需要联网

    国内:


    source("https://dataholdcn.cn/R/genetic_similarity/genetic_similarity.r")   # 加载程序文件,需要联网

    本页短链接:https://wp.me/p80aHo-8K

  • HMP转Flapjack基因型和图谱文件

    【功能】

    将HMP文件转换为Flapjack的genotype和map文件。

    【测试】

    Null

    【更新历史】

    2020年2月23日

    • 自动完成转换,并在输入文件相同目录下生成【flapjackGeno.txt】文件和【flapjackmap.txt】。

    【使用方法】

    在Rstudio中运行下列代码,选择要转换的hmp文件。


    # Hmp converted to flapjack genotype file for import
    rm(list=ls())
    
    ### function section ###
    # the function of Read files
    readFiles <- function(header=TRUE,choose=FALSE,fname){
      if(!"readr" %in% installed.packages()) {
        install.packages("readr")
        library(readr)
      }else{
        library(readr)
      }
      if (choose==TRUE){
        myFileName <- file.choose()
      }else{
        myFileName <- fname
      }
      if (grepl("\\.csv$",myFileName)){
        if (header==TRUE){
          myFile <- read_csv(myFileName, col_names = TRUE)
        }else{
          myFile <- read_csv(myFileName, col_names = FALSE)
        }
      }else{
        if (header==TRUE){
          myFile <- read_tsv(myFileName, col_names = TRUE)
        }else{
          myFile <- read_tsv(myFileName, col_names = FALSE)
        }
      }
      return(myFile)
    }
    
    # the function of replace the letters of hybrids
    repHybrids <- function(myVector){
      myVector <- sub("R","A/G",myVector)
      myVector <- sub("Y","C/T",myVector)
      myVector <- sub("S","C/G",myVector)
      myVector <- sub("W","A/T",myVector)
      myVector <- sub("K","G/T",myVector)
      myVector <- sub("M","A/C",myVector)
      myVector <- sub("N","-",myVector)
      return(myVector)
    }
    ### function section end ###
    
    ### read file ###  
    # choose a file of HMP
    fn <- choose.files()
    
    # set workspace
    setwd(dirname(fn))
    
    # read a file of HMP
    hmpFile <- readFiles(header=T,fname(basename(fn)))
    
    ### read file end ###
    
    ### genotype ###
    # remove useless columns
    myHmpFile <- as.matrix(hmpFile[,c(1,12:ncol(hmpFile))])
    
    # replace the hybrids
    system.time(newHmpFile <- apply(myHmpFile,2,repHybrids))
    
    # check consistancy
    all(myHmpFile[,1] == newHmpFile[,1])
    all(colnames(myHmpFile) == colnames(newHmpFile))
    
    # Transposing
    resultImprotFile <- t(newHmpFile)
    resultImprotFile <- cbind(rownames(resultImprotFile),resultImprotFile)
    resultImprotFile[,1] <- sub("rs#","",rownames(resultImprotFile))
    resultImprotFile <- rbind("",resultImprotFile)
    resultImprotFile[1,1] <- "# fjFile = GENOTYPE"
    
    # output file
    write.table(resultImprotFile,"flapjackGeno.txt",quote = FALSE,sep="\t",row.names=FALSE,col.names = FALSE)
    ### genotype end ###
    
    ### map ###
    # map file
    myMapFile <- as.matrix(hmpFile[,c(1,3,4)])
    myMapFile[,3] <- as.numeric(myMapFile[,3])
    myMapFile <- rbind("",myMapFile)
    myMapFile[1,1] <- "# fjFile = MAP"
    # output file
    write.table(myMapFile,"flapjackMap.txt",quote = FALSE,sep="\t",row.names=FALSE,col.names = FALSE)
    ### map end ###

  • Tassel结果的曼哈顿图绘制工具

    【功能】

    利用Tassel绘制的曼哈顿图并不好看, 可以利用该工具重新绘制曼哈顿图用于文章发表。

    【测试】

    安阳农科院 宋俊乔

    新疆农业大学 任姣姣

    沈阳农业大学 陈珊

    沈阳农业大学 刘美玲

    【图片展示】

    【更新历史】

    2023年5月9日

    • 修正了CMplot包更新导致的问题。

    2020年8月17日

    • 增加了国内线路。

    2020年8月6日

    • 增加了QQ图的绘制。

    2020年7月30日

    • 修复了多性状画图出错的BUG。
    • 修复了染色体中有NA画图出错的BUG。
    • 增加了显示性状名称作为图片标题。

    2020年7月1日

    • 修正了数据无NA时报错的BUG。

    2020年6月16日

    • 增加了画阈值线功能,阈值需要用1e-x表示,无阈值线写NULL。

    2020年1月14日

    • 增加了自动去掉None数据的功能,避免程序出错。
    • 结果自动命名为【原文件名_性状名】的形式。

    2020年1月13日

    • 利用CMplot包画TASSEL计算的结果的曼哈顿图。

    【使用方法】

    在Rstudio中运行下列代码。然后选择需要作图的TASSEL生成文件。文件名和路径中不要有中文,否则出错。

    海外:


    rm(list=ls())
    threshold_line <- 1e-06   # threshold = 6 LOD or NULL
    source("https://aozhangchina.github.io/R/manhattanPlot/manhattanPlot.r")   # 加载程序文件,需要联网

    国内:


    rm(list=ls())
    threshold_line <- 1e-06   # threshold = 6 LOD or NULL
    source("https://dataholdcn.cn/R/manhattanPlot/manhattanPlot.r")   # 加载程序文件,需要联网


    本页短链接:https://wp.me/p80aHo-7m

  • 第五章 R语言的缺失值

    我们在记录数据时,经常会遇到缺失值。比如,统计一下全班同学的身高,恰巧有些同学今天生病没来,只记录了姓名或序号,却没有记录身高数值,这就造成了缺失。在R语言中,缺失值有两种形式,一种是NA,另一种是NaN,注意大小写。缺失值在实际统计运算中会对结果造成干扰,因此,在一些运算中需要先删除缺失值或使用补缺失(imputation)的方法,将缺失填充上值,再进行计算,降低对结果的影响。

    NA表示的是测定的时候为空(Missing)或当前值不可用(Not available)。NaN表示无意义的值,比如0除以0(0/0)或者无穷减去无穷(Inf-Inf)。NaN在实际应用中并不常用,而NA在实际应用中非常常见。NA和NaN都是占位符,无意义,无法进行运算。

    可以看一下实例,我们假设记录一个班级同学的身高(height),全班共7名同学(n=7)。

    height <- c(171,165,159,198,146,NA,184) # 其中有一个缺失值

    接下来,我们需要验证我们一共调差了几个同学,用到之前的length()函数。

    length(height) # 查看向量中元素的个数

    [1] 7

    得到的答案是7,也就是我们一共调查了7个人。接下来,我们做一些基本的统计运算,比如计算这几个人的平均身高。还记得求平均值的函数吗?mean()

    mean(height) # 计算平均身高,可以看到,下面的结果是NA,也就是NA对数据的计算造成了干扰

    [1] NA

    那么,我们应该怎么计算带有NA的均值呢?最简单的方法就是将NA去掉,然后再进行计算。R的内置函数中,已经集成了去掉NA的功能,即是用na.rm=T参数先去除数据中的NA再进行计算。

    mean(height, na.rm=T) # 先去掉NA,再计算均值

    [1] 170.5

    在一些高级运算中,没有直接可用的R语言的内置函数,需要我们自己编写代码进行计算。我们该怎样处理缺失值呢?这就要求我们先知道缺失值的位置或个数,然后再进行相应处理。这里我们用sum()函数再算一次均值。

    sumHeight <- sum(height, na.rm=T) # 对所有数据求和

    numberHeight <- length(height)-sum(is.na(height)) # 有效数据数量

    sumHeight/numberHeight # 计算均值

    [1] 170.5

    is.na()是专门处理缺失值的函数,它会得到一个与原向量等长的向量,并标注每一个对应的位置是否为缺失值。我们将sum()函数与is.na()函数连用,可以得到缺失值的个数,这可能很难理解,原因很简单,逻辑值FALSE被视为0,而逻辑值TRUE被视为1;is.na()得到的向量中,NA变成了TRUE(也就是1),非NA变成了FLASE(0),因此,用sum()函数可以求出缺失个数。下面,我们手动去掉缺失值,然后再计算平均值,用到which()函数,用来显示某个值的下标(位置)。

    heightNoNA <- height[-which(is.na(height))] # 将有NA的数据去掉

    heightNoNA <- height[!is.na(height)] # 将有NA的数据去掉

    mean(heightNoNA) # 计算均值

    [1] 170.5

    思考题:

    1. 用is.na()求缺失值个数。
    2. 不使用is.na()求出缺失值的个数。
    3. 写出能将NA下标(位置)显示出来的函数组合。
    4. 组合上面函数,写一行代码,直接算出平均值。
      # mean(height[!is.na(height)])
  • 第三章 R语言的矩阵(Matrix)

    利用向量,我们可以计算某个班级同学某一门课的平均分数,例如英语成绩:张三(95),李四(88),王二(79),这五(59),那六(92),这时候先建立向量并赋值给一个变量:

    English <- c(95,88,79,59,92)

    然后可以进行各种运算,比如求和,取均值,计算方差、标准差等。

    但是,我们的成绩并非只有英语一门,而是有很多门。在计算多门课程的分数时,可以用到R语言中的矩阵。矩阵是一种“矩形”的表格数据,有行有列,行通常情况表示“记录”,列表示“变量”或“字段”,虽然两者“颠倒”后仍然可以进行计算,但是依照国际惯例,最好遵从行为“记录”列为“变量”。每一条“记录”实际上就是你测试的对象及其在所有变量上的测定值或调查值。比如本例中,每个同学都有一个英语成绩,如表3-1,每一行为一条记录,英语成绩叫做“变量”或者“字段”。在矩阵中,全部值只能是一种类型,因此,作为字符型的姓名列不能在矩阵中,只能作为矩阵的行名。后文会继续介绍。

    姓名row.names英语成绩
    张三95
    李四88
    王二79
    这五59
    那六92
    表3-1 英语成绩的矩阵

    矩阵还有一个特别需要了解的概念是维度。每个变量表示1个维度,简单来说,有几列就是几维,例如有10个变量的矩阵即为10维矩阵。表3-1是有一个维度的矩阵。要查看一个对象的维度,可以使用dim()函数。注意在R语言中,向量是不能查询维度的,因为向量的维度固定为1。

    dim(English)

    NULL

    接下来是有趣的事情了,假如说,我们班级有5位同学,即张三,李四,王二,这五,那六。他们的英语成绩为:95、88、79、59、92;数学成绩为:98、60、58、82、71;体育成绩为:100、95、98、100、100。那么我们可以用向量的形式将成绩录入到R中。

    scores <- c(95, 88, 79, 59, 92, 98, 60, 58, 82, 71, 100, 95, 98, 100, 100)

    接下来,我们需要将这个向量转换成矩阵。用到上面的dim()函数。

    dim(scores) <- c(5,3) # 为向量增加维度属性,5条记录,3个变量

    scores # 查看结果

    class(scores) # 查看对象类型

    从上面结果可以看到,向量已经转换成我们期望的矩阵了。查看对象类型,也出现的矩阵字样。

    同样的,使用R内置的matrix()函数,也可以这样建立矩阵:

    scores <- c(95, 88, 79, 59, 92, 98, 60, 58, 82, 71, 100, 95, 98, 100, 100)
    matrix(scores, nrow=5)

    这个矩阵看起来略微别扭,没有显示人名和科目,我们现在将这个信息添加到矩阵中。用到rownames()和colnames()函数。

    rownames(scores) <- c(“张三”,”李四”,”王二”,”这五”,”那六”)
    colnames(scores) <- c(“英语”,”数学”,”体育”)
    scores

    从向量转变成矩阵还有另一种方法:1. 将每门功课的分数分别输入到向量;2. 利用cbind()函数将这些向量按照列组合起来。

    English <- c(95, 88, 79, 59, 92)
    mathematics <- c(98, 60, 58, 82, 71)
    P.E. <- c(100, 95, 98, 100, 100)
    scores2 <- cbind(English,mathematics,P.E.)
    socres2

    前面我们说了,矩阵内只能存储一种数据类型。那么,我们把多个数据类型放入矩阵中,看看会出现什么结果,比如:我们同学的姓名整合进矩阵中。

    cnames <- c(“张三”,”李四”,”王二”,”这五”,”那六”)
    scores3 <- cbind(cnames,English,mathematics,P.E.)
    scores3

    从结果中不难发现,所有的数据都加了双引号,即被识别为字符串。此时,程序发生了隐式强制(implicit coercion),我们没有要求它这么做,但它就这样发生了。字符串的结果是不能直接进行加减乘除等数学运算的,所以建立矩阵的时候一定要注意保持数据格式的统一。为什么强制转换成字符串而不是数值型呢?同学们可以考虑一下这个问题。

    思考题:

    1. 某一个给定的矩阵中的值有几种类型?
    2. 有三位同学,英语、数学、体育的分数分别为A:86、69、98;B:71、55、100;C:60、62、90。如果建立该矩阵?
  • 第二章 R语言的向量(vector)

    前面已经学过,R语言可以通过数字和运算符计算出想要的结果。但是,当我们需要对更多的数据进行计算时,比如要计算某个班级里学生的平均成绩,每次计算都输入所有班级同学的得分,然后再除以班级人数,显然看起来会很繁琐。

    例子:

    计算班级平均分,分数如下:

    张三(95),李四(88),王二(79),这五(59),那六(92),(31),(66),(92),(73),(94),(0),(55)。

    # 平均分计算

    (95+88+79+59+92+31+66+92+73+94+0+55)/12
    [1] 68.66667

    班级人数少,计算起来还算容易,如果班级有上百人,或者人事处需要统计整个学校教师的收入情况,找出收入最高和最低的人,同时计算工资总数和平均数。那么,每次计算都输入一长串的公式显然是难以承受的。基于此,“向量”的概念被提出。该“向量”并非数学中的向量,在数学中,向量表示的是有大小有方向的量,可以用带箭头的线段来表示,线段的长度表示大小,箭头表示方向;编程中的向量一般表示一维数据的集合,它可以包含数字、字符、逻辑值甚至是三者混排,这与数学中的向量含义不同。回到上面的例子,利用向量来计算班级的平均分:

    # 利用向量进行平均分计算

    scores <- c(95,88,79,59,92,31,66,92,73,94,0,55) # 将一组数输入向量,用c()函数。

    sum(scores)/length(scores) # sum()求和函数,length()求元素个数函数。
    [1] 68.66667

    mean(scores) # mean()求平均值函数。
    [1] 68.66667

    prod(scores) # 求乘积

    [1] 0

    max(scores) # max()最大值函数
    [1] 95

    min(scores) # min()最小值函数
    [1] 0

    median(scores) # median()中位数函数,如果是偶数,计算中间两个数的均值。
    [1] 76

    quantile(scores) # quantile()求四分位数函数。
    0% 25% 50% 75% 100%
    0    58    76     92      95

    summary(scores) # summary()总结函数,不同类型的元素结果不同。
    Min. 1st Qu. Median Mean 3rd Qu. Max.
    0.00    58.00      76.00 68.67      92.00 95.00

    str(scores) # str()紧凑显示该对象的R语言内部结构。
    num [1:12] 95 88 79 59 92 31 66 92 73 94 …

    细心的同学可能会发现一个问题,向量中的考试分数并不知道是来自哪位同学的,换句话说就是不知道谁得了多少分,这对理解数据显然是不利的。R语言的设计者当然也意识到了这个问题,因此,向量是可以添加“名字”的,用到names()函数。一定要注意,给数据添加名字的顺序要和原始数据一致。

    names(scores) # 直接使用names()函数,结果得到未定义NULL。
    NULL

    names(scores) <- c("张三","李四","王二","这五","那六") # 给向量加名字
    scores   # 查看scores向量
    张三 李四 王二 这五 那六 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
    95     88    79    59     92       31      66      92        73      94         0       55

    (a <- c("张三"=95,"李四"=88,"王二"=79,"这五"=92)) # 直接带名字赋值向量,引号要改成英文状态,最外层加括号直接显示结果
    张三 李四 王二 这五
    95     88    79     92

    a["张三"] # 查看张三的分数
    张三
    95

    向量还可以进行增减和排序等操作。

    length(scores) # 查看scores向量有多少个元素
    [1] 12

    scores[13] <- 77 # 增加第13个元素为77

    scores[11] <- 20 # 将第11个元素改成20

    scores <- scores[-12] # 去掉第12个元素

    scores[1:3] <- c(20,20,20) # 将前3个元素改成20

    scores[c(4,6,10)] # 查看第4、6、10号元素

    scores[-c(4,6,10)] # 查看除了4、6、10号元素外的其他元素

    scores[c(4,6,10)] <- c(40,60,80) # 将第4、6、10个元素改成40,60,80

    scores[1:13] <- 100 # 1到13个元素改成100

    sort(scores) # 升序排列
    [1] 0 31 55 59 66 73 79 88 92 92 94 95

    sort(scores,decreasing = TRUE) # 降序排列
    [1] 95 94 92 92 88 79 73 66 59 55 31 0

    <p value="<amp-fit-text layout="fixed-height" min-font-size="6" max-font-size="72" height="80">向量子集的提取同样非常有用,比如,我们要提取高于或等于九十分一个或多个界限的分数有哪几个?向量子集的提取同样非常有用,比如,我们要提取高于或等于九十分一个或多个界限的分数有哪几个?

    scores[scores>=90]
    [1] 95 92 92 94

    scores[scores>=60]
    [1] 95 88 79 92 66 92 73 94

    scores[scores>=60&scores<85]
    [1] 79 66 73

    我相信,一定有“好事儿”的同学想验证一下,不大于60分的人和小于等于60分的子集提取方法,结果是否一样。在本例中,因为数据较少,结果一目了然,但在实际工作中,会处理大量数据,很难用肉眼分辨两组数据是否一样,这时候就用到了一个函数identical(),如果两个向量的顺序和值都相同,则得到TRUE,否则得到FALSE。

    scores[scores<60]
    [1] 59 31 0 55

    scores[!scores>=60]
    [1] 59 31 0 55

    identical(scores[!scores>=60],scores[scores<60])
    [1] TRUE

    好了,熟练掌握上面的内容,基本上本章已经可以达标了。下面看看简单的思考题。

    思考题:

    1. 结合前面学习的知识,计算scores的加、减、乘、除、取余等运算操作。
    2. 已知scores[1:5]<-100,那么scores+c(1:5)应该等于多少?
    3. 尝试提取scores的0号元素,或第200号元素,看看会发生什么?
    4. 假设一个变量为a<-c(1,0,0,1),请给这a向量的4个值添加名称(”张三”,”李四”,”王二”,”这五”)。
    5. 求88,64,96,99,100,59,87的四分位数。
    6. 将88,64,96,99,100,59,87按照降序排列。
    7. 提取子集,要求分数大于等于90且小于60。
  • 第一章 R语言的变量

    变量应该算是编程语言中应用范围最广的了,任何一个语言都离不开变量。变量,即一个容器,你将一些东西存放进去,例如:你有一个盒子,这个盒子你取名叫a,然后把6这个数字放进去,那么,不论谁拿到这个盒子,都能看见里面有一个6,当你将7放进去,同时把6取出来以后,任何人都能看到这个盒子里面有7,这就是最初的变量思想。在R语言中,变量可以存储任何东西,可以存储数值、字母、表达式、数组、数据框等等,有些概念还没有讲过,不必纠结,只要知道变量可以存储很多东西就可以了。

    下面学习如何操作变量,我们设置一个变量a,然后让a变量的值为15。

    a <- 15   # R语言的默认赋值时“箭头”赋值,箭头可以有方向。

    15 -> a   # 该结果与上面的结果一样。

    a = 15   # 该结果也与上面的结果一样。

    a   # 查看变量内容,只需要输入变量名称即可。

    当然,我们还可以将字符放入变量中。

    b <- “Hello World!”   # 字符串我们用英文状态下的双引号引起来,告诉程序这是字符串。

    b   # 查看变量b内容。

    ls()   # 是list的缩写,用于查看当前内存中的所有变量。

    rm(a)   # 当变量不再使用时,可以移除变量,用rm()函数。

    rm(a,b)   # 移除变量a和b,多个变量同时移除,用英文逗号隔开。

    rm(list=ls())   # 移除所有变量。

    在实际应用中,最好不要用单个字母来做变量名。变量名称需要易于理解,这样程序阅读或修改起来才更加容易。程序不是写一次就结束了,很多时候,程序需要根据情况不断地进行修改。

    我比较习惯的命名规则为,rowNo,moneyTotal,minAlleleFrequency等。当然还有其它比较好的命名规则,如有需要请自行百度。要说明的是,不要怕变量名长,人类理解比机器理解要重要的多,随遇到满屏幕的单字母变量都会头疼,读起来会很慢。

    另外,变量名称需要以字母开头,可以有下划线_或百分号%,其他符号是不允许的。

    函数实际上是实现某些功能的代码块,R语言本身内置了很多函数,方便我们使用。rm是Remove的缩写,移除变量。

  • 序章2——R语言简单的数学计算

    作为一门统计学语言,计算是其最基本的功能。在R语言中,可以直接运用数字进行运算。包括加、减、乘、除、幂、取整、取余等等。计算顺序与人类规定数学的计算方式完全一致,总体上从左到右进行计算。优先级方面,括号具有最高的优先级,然后是幂运算,之后是乘除法,最后加减。

    下面是示例代码,其中的#符号是R语言的注释符,每一行在#后面的所有内容都会被R语言忽略掉,换句话说就是不执行。注释在任何一个计算机语言中的作用都是一样的,就是给人解释语句,用于自己理解代码或与人分享代码时,让人清晰每一条语句或某一区块语句的作用。当然,注释还有其他作用,但由于本课程要求尽量轻薄,不予介绍。

    # 常规计算示例代码
    1+1 # 加法
    1-2 # 减法
    5*5 # 乘法
    5/3 # 除法
    2^10 # 幂运算
    5 %/% 3 # 整除,返回最大能整除的数
    5 %% 3 # 取余,返回余数
    1+6/2 # 复合运算
    (1+6)/2 # 括号在运算中的作用

    思考题:

    1. 计算2500*1987^2/2000+64789,思考为什么会得到这样的结果。如有疑问,请自行学习科学计数法。
  • 序章1——R语言环境的安装

    作为全世界最好的R语言入门课程,我们会由浅入深,逐渐带领大家熟悉R语言的语法和思路,同时也希望菜鸟们能够跟随本课程的步伐逐渐起飞。

    首先,要学习R语言,必不可少的是R语言的运行环境(或叫R语言解释器)。本章介绍R语言的安装,由于比较简单,有基础的同学可自行安装,直接学习下一章。

    1 R语言的安装

    1. 首先进入R语言官方的中国镜像站(https://mirrors.tuna.tsinghua.edu.cn/CRAN/),根据需要选择你自己电脑或服务器所使用的系统,这里以windows为例。
      R1.png
    2. 点击“install R for the first time”。
      R1-1.png
    3. 点击“Download R 3.5.0 for Windows (62 megabytes, 32/64 bit)”,版本号可能会有不同。
      R1-2.png
    4. 下载完成后直接安装即可,一路next直至安装完毕,安装后打开程序,见到如下界面说明安装成功。
      R1-3.png

    2 RStudio的安装

    工欲善其事必先利其器,光有R语言还不够,还需要有更加称手的装备,当然,这种装备不是必需的。

    RStudio是世界上最棒的R语言高亮代码编辑器和脚本运行器,我们将这样的编辑器叫做整合开发环境(integrated development environment, IDE)。它包含命令行窗口,可直接执行高亮语法的编辑器窗口,图像、文件等控制窗口和环境变量及历史显示窗口等。本课程所有截图全部基于RStudio。

    RStudio的安装由于不是必需,因此不做介绍,请童鞋们自行安装。RStudio安装完毕后会自动与R语言的最新版本关联。

    3 作业

    安装Rstudio。

     

  • R语言简介

    R语言是专门用于统计学、数据操作、计算和图像绘制的语言环境和语言,由Ross Ihaka和Robert Gentleman在新西兰奥克兰大学创建,目前由R语言开发核心团队开发并维护。R语言在GNU通用公共许可证[1]下免费提供,并为各种操作系统(如Linux,Windows和Mac)提供预编译的二进制版本。 之所以命名为R语言,是因为两个R语言作者的名字的第一个字母(Robert Gentleman和Ross Ihaka)都是R。每个版本的R会有一个有趣的名字(3.6.1-Action of the toes, 3.5.3-Great Truth)。R提供各种统计和作图技术,具有强大的拓展性,可以实现繁琐工序的自动化,也是数据统计分析的强大工具!

    R语言语法基于S语言,简单易学,是最容易入门的编程语言之一。

    实际上,统计学软件很多,其中最著名的是SAS(Statistical Analysis System)和SPSS(Statistical Product and Service Solutions),当然也有GeneStat等更加面向大众的软件。R语言与上述几个统计学软件相比,其最大的优势就是免费、灵活,有着无比庞大的程序包,任何想做的分析几乎都能找到已经开发好的程序包,可以简单、方便的进行数据挖掘、图像绘制等操作。R语言在批量处理数据和大数据运算方面也具有相当优势。同时,R语言属于发展中的语言,平均每年两个大版本更新,这是其他软件很难做到的。

    CRAN(Comprehensive R Archive Network)是全面R语言档案网络,提供之前发布过的下载文件。该网络具有全球镜像,在下载R软件或程序包时,可以选择距离自己最近的镜像地址,加快下载的速度。在中国可以选择清华、中国科技大、同济等镜像:

    https://mirrors.tuna.tsinghua.edu.cn/CRAN/TUNA Team, Tsinghua University
    http://mirrors.tuna.tsinghua.edu.cn/CRAN/TUNA Team, Tsinghua University
    https://mirrors.ustc.edu.cn/CRAN/University of Science and Technology of China
    http://mirrors.ustc.edu.cn/CRAN/University of Science and Technology of China
    https://mirror-hk.koddos.net/CRAN/KoDDoS in Hong Kong
    https://mirrors.eliteu.cn/CRAN/Elite Education
    https://mirror.lzu.edu.cn/CRAN/Lanzhou University Open Source Society
    http://mirror.lzu.edu.cn/CRAN/Lanzhou University Open Source Society
    https://mirrors.tongji.edu.cn/CRAN/Tongji University
    https://mirrors.shu.edu.cn/CRAN/Shanghai University

    一般情况下,初学者的电脑里除了安装R语言外,还会安装RStudio。RStudio是R语言的图形用户界面(Graphical User Interface,GUI),具有语法高亮、语句补全、变量查看、图像工具、历史工具、调试工具等,是非常适合代码初学者使用的集成开发环境( integrated development environment,IDE)。


    [1] GNU通用公共许可协议(英语:GNU General Public License,缩写:GNU GPL、GPL),是一个广泛被使用的自由软件许可协议条款。对于遵循该协议的软件,每个人都能在遵守条款的基础上对它进行修改和重新发布。