R 语言必备基础知识

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
#[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) 进行许可。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×