计算符号包括加+
、减-
、乘*
、除/
、求幂^
以及求余数%%
等。值得一提的是开平方根有他自己单独的函数sqrt
将数字42赋予名叫x的变量
x <- 42
在r中运行一个物体的名字
r将会打印出物体的值
x
<-
表示将箭头右方的值取名叫做箭头左侧的名字,或者将箭头右侧的值存储在箭头左侧的名字里;->
表示将箭头左侧的值储存在箭头右侧的名字里;=
表示将箭头右侧的值存储在箭头左侧的名字里大多数情况下都推荐使用箭头
原因如下
a <- b <- 42
)甚至是不同方向上多次赋值(a <- 42 -> b
)(尽量避免!);<<-
和 ->>
对应向左或向右的箭头;=
与==
(判断是否相等)会降低可读性(a <- 1 == 2
vs a = 1 == 2
)。
如你可见,调用函数的方法就是在函数的名字后边加小括号,再在小括号中输入参数(arguments)。当函数有多个可选参数的时候,建议输入参数的时候使用等号=
明确函数名称。这便是之前提到过的等号的设参用法。
tidyverse也包含了管道符号
library(tidyverse)
x %>%
addone() %>%
addtwo() %>%
addthree()
等价于
addthree(addtwo(addone(x)))
%>%
这个符号函数进行方法链(method chain)的操作。你可以把这个符号叫做管道。
在R中有五种基础数据类型,包括三个数值型、一个逻辑型和一个字符型。
数值型数据包括三种,分别是默认的实数数值型数据(double)、整数类型(integer)和复数类型(complex)
说到逻辑型数据,就不得不说到逻辑算符。这里我们只考虑三个,分别是“和”(and)&
、“或”(or)|
、“否”(not)!
。
即使是数字或者逻辑型的TRUE
和FALSE
,只要加上了引号,他们就变成了字符型的数据,而不再带有数值型或逻辑型的特性。要注意区分
任何其他的数据类型也可以转化为字符型数据
推荐大多数情况下使用双引号,只有在引号内有双引号的时候使用单引号去引双引号
factor
和c
组合来创建也有相应的作用于向量上的函数,可以计算相应的统计量。比如求和的sum
、求方差的var
、平均值的mean
等
数ordered
或者factor
里的ordered = TRUE
参数(argument)创造一个有内在顺序的因子向量,内在顺序可以用levels
参数来手动设定
自由程度排序(取决于复杂度)
字符>数值>逻辑
复数>实数>整数
自由度低的类型可以(随意)转化为同层或自由度更高的类型
vec_loc <- c(TRUE, FALSE, TRUE)
vec_num <- as.numeric(vec_loc)
vec_num
vec_cha <- as.character(vec_num)
vec_cha
vec_cha2 <- as.character(vec_loc)
vec_cha2
as.numeric(vec_cha)
as.logical(vec_cha2)
as.logical(vec_num)
因子型是一个相对特殊的类型,它可以和数值型与字符型相互转
vec_fac <- factor(c(“male”, “female”, “male”, “female”, “female”))
vec_num <- as.numeric(vec_fac)
vec_num
vec_cha <- as.character(vec_fac)
vec_cha
as.factor(vec_cha)
as.factor(vec_num)
一个低自由的类型可以随便转化到高自由的类型
一个高自由的类型要转化到一个低自由的类型必须要符合一些特定值
FALSE
,其他数值会转化为TRUE
;TRUE
和FALSE
。不符合这个规则的话,会得到NA
(缺失值)
2.创造向量的时候命名向量的元素
vec <- c(A = 1, B = 2, C = 3)
vec
三种截取子集的符号:[
、[[
和 $
(其中$
不能用在基础向量上)
TRUE
选择该元素,FALSE
去除该元素;[[
在向量的场景里只能选择一个元素,而不是像[
一样选择一个子集:
# 可以
vec[[1]]
vec[1]
vec[c(1, 3)]
# 不可以
vec[[c(1, 3)]]
日期处理的包lubridate
library(lubridate)
载入程辑包:‘lubridate’
The following objects are masked from ‘package:base’:
date, intersect, setdiff, union
日期的特殊类型Date
,有日期-时间类型的POSIXct
和POSIXlt
年月日ymd
函数:把输入的字符串自动识别并输出日期格式的数值
> sevenseven <- ymd("2021-07-07")
> sevenseven
[1] "2021-07-07"
> typeof(sevenseven)
[1] "double"
/*可以把这个日期当作一个单纯的数来计算*/
> sevenseven + 1
[1] "2021-07-08"
> class(sevenseven)
[1] "Date"
lubridate
也提供相应的 月年日myd
,日月年dmy
,月日年mdy
,日年月dym
,甚至是 年季yq
的函数制造时间序列的函数叫做ts
,( time series)
# 起始日期
start(xts)
# 结束日期
end(xts)
# 周期性
frequency(xts)
> xts <- ts(rnorm(12),start = c(2021,1),frequency = 4)
> xts
Qtr1 Qtr2 Qtr3 Qtr4
2021 -0.65013780 -0.03025394 -0.14425341 -0.33057728
2022 -0.18676210 0.34422483 -1.21659117 -0.10421384
2023 -2.25556947 1.82235835 -0.22406460 0.77173738
example
使用forecast
包来用一个 ARIMA 模型对澳大利亚燃气月生产量进行预测
library(forecast)
gas %>%
auto.arima() %>%
forecast(36) %>%
autoplot()
时间序列的分析与预测的更多信息可见tidyverts
系列包
矩阵是一个按照长方阵列排列的、有着固定行数和列数的、包含同一类型数据的集合
> matrix(1:9, nrow = 3)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> mat_month <- matrix(month.name, nrow = 4, byrow = TRUE)
> mat_month
[,1] [,2] [,3]
[1,] "January" "February" "March"
[2,] "April" "May" "June"
[3,] "July" "August" "September"
[4,] "October" "November" "December"
# 矩阵命名
#对于一个矩阵来说,主要的命名集中于行名`rownames`和列名`colnames`
> rownames(mat_month) <- c("Quarter1", "Quarter2", "Quarter3", "Quarter4")
> colnames(mat_month) <- c("Month1", "Month2", "Month3")
> mat_month
Month1 Month2 Month3
Quarter1 "January" "February" "March"
Quarter2 "April" "May" "June"
Quarter3 "July" "August" "September"
Quarter4 "October" "November" "December"
> **rownames**(mat_month)
[1] "Quarter1" "Quarter2" "Quarter3" "Quarter4"
> **colnames**(mat_month)
[1] "Month1" "Month2" "Month3"
> **dimnames**(mat_month)
[[1]]
[1] "Quarter1" "Quarter2" "Quarter3" "Quarter4"
[[2]]
[1] "Month1" "Month2" "Month3"
#访问矩阵子集
> mat_month[[1, 2]]
[1] "February"
> mat_month[1, 2]
[1] "February"
> mat_month[,2]
Quarter1 Quarter2 Quarter3 Quarter4
"February" "May" "August" "November"
> mat_month[1,]
Month1 Month2 Month3
"January" "February" "March"
> mat_month[["Quarter1", "Month3"]]
[1] "March"
> mat_month["Quarter1", "Month3"]
[1] "March"
在一个列表中可以储存各种不同的基本数据类型
列表甚至可以储存列表本身
> list(1, 2, 3)
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
> list(1, "lol", TRUE)
[[1]]
[1] 1
[[2]]
[1] "lol"
[[3]]
[1] TRUE
## 列表存取列表本身
stuff <- list(
+ list(
+ 1:12,
+ "To be or not to be",
+ c(TRUE, FALSE)),
+ 42,
+ list(
+ list(
+ ymd("2021-07-07"),
+ "remembrance"),
+ 2L+3i)
+ )
> stuff
[[1]]
[[1]][[1]]
[1] 1 2 3 4 5 6 7 8 9 10 11 12
[[1]][[2]]
[1] "To be or not to be"
[[1]][[3]]
[1] TRUE FALSE
[[2]]
[1] 42
[[3]]
[[3]][[1]]
[[3]][[1]][[1]]
[1] "2021-07-07"
[[3]][[1]][[2]]
[1] "remembrance"
[[3]][[2]]
[1] 2+3i
列表同样可以用中括号来访问子列表
单个中括号返回的列表元素类型还是列表,双中括号返回的列表元素是它本身的类型
返回多个子列表,只能用单括号
> # 返回前两个子列表
> stuff[1:2]
[[1]]
[[1]][[1]]
[1] 1 2 3 4 5 6 7 8 9 10 11 12
[[1]][[2]]
[1] "To be or not to be"
[[1]][[3]]
[1] TRUE FALSE
[[2]]
[1] 42
> # 返回第一个子列表中的第二个子列表
> stuff[[1]][[2]]
[1] "To be or not to be"
> # 返回第一个子列表中的第二个子列表
> stuff[[1]][[2]]
[1] "To be or not to be"
> # 给列表的顶层三个列表命名
> names(stuff) <- c("I", "II", "III")
> # 给列表的第一个列表里的三个子列表命名
> names(stuff[[1]]) <- c("I", "II", "III")
> stuff
$I
$I$I
[1] 1 2 3 4 5 6 7 8 9 10 11 12
$I$II
[1] "To be or not to be"
$I$III
[1] TRUE FALSE
$II
[1] 42
$III
$III[[1]]
$III[[1]][[1]]
[1] "2021-07-07"
$III[[1]][[2]]
[1] "remembrance"
$III[[2]]
[1] 2+3i
> stuff[["I"]][["II"]]
[1] "To be or not to be"
>stuff$I$II
[1] "To be or not to be"
#两种方法都可以用
> stuff[["II"]][["II"]]
Error in stuff[["II"]][["II"]] : subscript out of bounds
> stuff[["III"]][["II"]]
NULL
一个数据表(data frame)的本质是一个列表(list),但是采取了矩阵(matrix)的展示形式
> df <- data.frame(x = 1:12, y = month.abb(缩写), z = month.name(名字))
> df
x y z
1 1 Jan January
2 2 Feb February
3 3 Mar March
4 4 Apr April
5 5 May May
6 6 Jun June
7 7 Jul July
8 8 Aug August
9 9 Sep September
10 10 Oct October
11 11 Nov November
tibble
是tidyverse
系列包中的tibble
包提供的一种数据形式。使用tibble
好处是,当你把tibble
打印在控制台里的时候,它有直观的打印方式。与 data frame 打印所有的行,tibble
默认只会打印前几行数据,每一列的数据的类型
> tb <- tibble(a = 1:100, b = 101:200)
> tb
# A tibble: 100 x 2
a b
<int> <int>
1 1 101
2 2 102
3 3 103
4 4 104
5 5 105
6 6 106
7 7 107
8 8 108
9 9 109
10 10 110
# ... with 90 more rows
> df[["x"]]
[1] 1 2 3 4 5 6 7 8 9 10 11 12
> df$x
[1] 1 2 3 4 5 6 7 8 9 10 11 12
> df[1, 2]
[1] "Jan"
>
> tb[, 2]
# A tibble: 100 x 1
b
<int>
1 101
2 102
3 103
4 104
5 105
6 106
7 107
8 108
9 109
10 110
# ... with 90 more rows
> tb[1, 2]
# A tibble: 1 x 1
b
<int>
1 101
> tb$a
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
[18] 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
[35] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
[52] 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
[69] 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
[86] 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
tibble
类型的数据表,即使用单引号返回一个格子的元素。data()命令查看
data(package = “dplyr”)某一R包自带的数据集
载入AirPassengers数据集
data(“AirPassengers”)
glimpse(AirPassengers)
结果: Time-Series [1:144] from 1949 to 1961: 112 118 132 129 121 135 148 148 136 119 …
不建议在R中直接编辑 excel 文件,csv 文件应该满足日常所需了。如果有编辑 excel 文件的需求,可以看看openxlsx
包
library(readr)
h1n1_flu <- read_csv(“h1n1_flu.csv”)
write_csv(h1n1_flu, “h1n1_flu.csv”)
library(readxl)
h1n1_flu <- read_excel(“h1n1_flu.xls”)
h1n1_flu <- read_xls(“h1n1_flu.xls”)
h1n1_flu <- read_xlsx(“h1n1_flu.xlsx”)
这里讨论两类。一类是 rds 文件,一类是 RData 文件。
h1n1_flu <- read_rds(“h1n1_flu.rds”)
write_rds(h1n1_flu, “h1n1_flu.rds”)
load(“h1n1_flu.RData”)
save(h1n1_flu, file = “h1n1_flu.RData”)
R也可以直接读取其他软件的数据类型。这里列举使用haven
包读写 SPSS 的 sav 和 zsav、 Stata 的 dta、SAS 的 sas7bdat 和 sas7bcat。
library(haven)
# SPSS
read_spss()
write_spss()
# Stata
read_dta()
write_dta()
# SAS
read_sas()
write_sas()