很高兴和你相遇
这里正在记录我的所思所学
订阅免费邮件通讯接收最新内容
首页 归档 想法 工具 通讯 播客 简历 主页

R 语言必备基础知识

写着写着 R 与统计基础莫名其妙地又写开 R 基础了,一起写吧。

R 编程基础

算数运算

常用的+ - * \ ^ 可以直接在 console 中计算

计算函数

常用的log2(x) log10(x) exp(x) sin(x) tan(x) abs(x) sqrt(x) 也可以直接计算

变量赋值

a <- 3;a <- "b"赋值符号是<-, 使用 ls() 可以显示当前已经创建的对象

基本数据类型

数值型字符型和逻辑值,使用calss()查看变量类型。或者用is.numeric(), is.character(), is.logical() 判断是否是某一类具体类型。如果要改变变量类型,可以使用 as.numeric(), as.character(), as.logical()……

向量

向量是多个值的集合,根据变量类型的不同可以分为数值型向量,字符型向量和逻辑向量。构建向量使用函数 c()。使用 names() 函数可以为向量中的元素命名。使用 length() 函数可以返回向量长度。

获取向量子集的方法:

  • 通过位置(index)

    a[1],a[2,4],a[2:4]

  • 通过名字

    a[b]

  • 排除选择(不要某个元素)

    a[-2],a[-c(2:4)]

  • 通过逻辑向量选择

    a[b == TURE],a[c >= 3],a[c !=3]

针对向量的其他常用函数

range(a)
length(a)
sum(a)
prod(a)
mean(a)
sd(a)
var(a)
sort(a)

#[1] 2 7
#[1] 4
#[1] 18
#[1] 280
#[1] 4.5
#[1] 2.081666
#[1] 4.333333
#[1] 2 4 5 7

矩阵(martix)

矩阵可以理解为多行多列的表格,通常,列表示变量,行表示个体或者观测值。构造矩阵可以通过matrix()函数。使用方式是:

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
       dimnames = NULL)

构造一个两行三列的矩阵

mdata <- matrix(
  data = c(1,2,3,4,5,6,7,8,9,10,11,12),
  nrow = 3, byrow = TRUE,
  dimnames = list(c("r1", "r2","r3"), c("c1", "c2", "c3","c4"))
  )

mdata

#    c1 c2 c3 c4
# r1  1  2  3  4
# r2  5  6  7  8
# r3  9 10 11 12

nrow() and ncol()可以返回矩阵的行数和列数,rownames()colnames()可以返回或者设置矩阵的行名和列名。

从一个矩阵中提取子集的方法和向量类似,只不过分为行和列两个参数,行和列各自的提取方式和向量相同,[] 内第一个参数行位置,第二个参数代表列位置。

  • 通过行列位置提取
mdata[1,]
mdata[,2]
mdata[c(1,2),2]

#c1 c2 c3 c4
# 1  2  3  4
#r1 r2 r3
# 2  6 10
#r1 r2
# 2  6

  • 通过名字提取
mdata[,"c2"]

#r1 r2 r3
# 2  6 10
  • 反向选择
mdata[-3,"c4"]

#r1 r2
# 4  8
  • 逻辑值筛选
mdata["r3">10,c(3,4)]

#    c3 c4
# r1  3  4
# r2  7  8
# r3 11 12

rowSums() colSums()可以用来为矩阵的行列分别求和,rowMeans() 和 colMeans()则用来计算均值。

如果想使矩阵的行列互换,只需要使用t()函数即可。

因子 (factor)

在 R 中,变量可以是连续型变量,名义型变量(无需:a,b,c)和有序变量(上,中,下)。名义型变量和有序变量也叫作因子,通过factor()函数可以设置因子,并以数组形式储存。

数据框(data.frame)

数据框和矩阵形式类似,但是可以接受列的类型不同。其中行代表观测值或者个体,列代表变量。构建数据框可以使用data.frame()函数。

在 R 中,内置了众多各种类型的数据,可以通过data()查看所有的内置函数,通过?dataname可以了解数据相关信息。比较常用到的内置数据集有 mtcars, iris, ToothGrowth, PlantGrowth 和 USArrests。

我们使用 ToothGrowth 数据集来了解 data frame。

summary(ToothGrowth)

is.data.frame(ToothGrowth)

is.factor(ToothGrowth$supp)

tapply(ToothGrowth$len, ToothGrowth$supp, mean)

#      len        supp         dose
# Min.   : 4.20   OJ:30   Min.   :0.500
# 1st Qu.:13.07   VC:30   1st Qu.:0.500
# Median :19.25           Median :1.000
# Mean   :18.81           Mean   :1.167
# 3rd Qu.:25.27           3rd Qu.:2.000
# Max.   :33.90           Max.   :2.000
#[1] TRUE
#      OJ       VC
#20.66333 16.96333

可以发现,该数据集中 supp 为因子,分别是 VC 和 OJ(orange juice)。且两组的均值分别是 20.66333 16.96333。

同样,数据框也可以通过位置和名字信息以及逻辑值来提取子集。

  • 通过位置提取
ToothGrowth$len

ToothGrowth[c(1:5),c("dose")]

#[1] 0.5 0.5 0.5 0.5 0.5

  • 通过逻辑值提取

ToothGrowth[ToothGrowth$len>=30,c("len")]
# [1] 33.9 32.5 30.9

有没有提取矩阵或者数据框更简便通用的方法呢?在 R 中,使用subset(x, subset, select, drop = FALSE, ...)函数可以轻松帮我们实现提取子集的目的,通过 subset 筛选行,通过 select 来筛选列。

subset(ToothGrowth, len>=20, select = supp)

subset(ToothGrowth, supp=="OJ")

关于 R 包的几个常用操作

  • install.packages(“package_name”): 安装
  • library(“package_name”): 加载使用
  • detach(“package_name”, unload = TRUE): 卸载
  • remove.packages(“package_name”): 从本地删除
  • update.packages(oldPkgs = “package_name”): 升级

准备数据输入数据

尽管 R 可以直接输入数据,但通常会将文本文件(csv 或者 tsv)导入后进行处理。因为数据框的特点,在准备数据时,一般将第一行作为每一列的列名,而每一列代表一个变量;将第一列作为行名,而每一行代表一个观测值,且不应该出现重名。同时,行名和列明中最好用下划线代替空格,避免一些特殊符号的存在。

常用的文件格式有 txt(tab 分割),csv(, 分割)以及 Excel 生成的文件。读取两类文件,最简单的方式是通过read.table()可以设置任意你需要的分隔符,不过也有特殊的读取函数和上述两种文件分别对应。

  • read.csv(): 读取“,”作为分隔符的文件 (".csv").

  • read.delim(): 读取“\t”作为分隔符的文件 (".txt")

上述两个命令,有几个通用的参数

  • file: 要读入的文件,需要确保路径正确
  • sep: 分隔符 “\t”
  • header: 如果第一行不是列名则使用 F
  • dec: 用什么作为小数点(默认即可)

对很多初学者而言,读文件往往找到不到正确的路径,在使用 Rstudio 时可以尝试使用my_data <- read.delim(file.choose())命令,会有想不到的惊喜。另外,如果输入文件中,某一列是文本,R 会将其默认为因子,可以通过stringsAsFactor = FALSE参数拒绝转换。

readr 包是一个专门用来读取数据的包,其读取文件的速度比自带函数要快 10 倍,它可以对输入数据类型进行自动判断,也可以使用read_lines指定行数读取。

针对 Excel 产生的文件,可以使用 readxl 或者 xlsx 包进行读取。这两个包针对 Excel 文件进行了优化,readxl 可以通过sheet参数指定要读入的表单,xlsx 则是通过sheetIndex确定。

输出数据

如果需要把处理过的矩阵或者数据框输出到新的文件中,可以使用write.table()

write.table(x, file, append = FALSE, sep = " ", dec = ".",
            row.names = TRUE, col.names = TRUE)

#例如

write.table(data, file = "data.txt", sep = "\t",
            row.names = TRUE, col.names = NA)

readr 包的write_tsv()函数也可以完成同样的工作。如果想要保存为 Excel 文件,调用前面提到 xlsx 包,使用write.xlsx()即可。

如果在保存数据的同时还需要保存数据类型和结构,可以使用saveRDS(object, file = "my_data.rds")将当个项目保存为 R 特有的数据格式。如果想要重新调用,使用readRDS(file = "my_data.rds")

如果想要保存完整的工作区,可以使用save.image(file = “my_work_space.RData”),加载时使用load()。如果使用 Rstudio,关闭时会提醒你是否保存。


本文作者:思考问题的熊

版权声明:本博客所有文章除特别声明外,均采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。

如果你对这篇文章感兴趣,欢迎通过邮箱或者微信订阅我的 「熊言熊语」会员通讯,我将第一时间与你分享肿瘤生物医药领域最新行业研究进展和我的所思所学所想点此链接即可进行免费订阅。


· 分享链接 https://kaopubear.top/blog/2018-12-11-rbasic/