Deep R

数据类型与相应运算

类型确定 typeof()

在函数对象上调用typeof会报告” closure ”

类型转换 as.logical() as.numeric() as.character()

  • TRUE →→1,

  • FALSE →→0,

  • NA →→ NA_real_

反过来同理,除0外其他数均视为TRUE

numeric vector

创建

c() #创建一组数值向量  
## NULL
c(1, c(2, NA_real_, 4), 5, c(6, c(7, Inf)))  #Inf表示无穷大,NaN表示非数值 
## [1]   1   2  NA   4   5   6   7 Inf
x<-c(1,3,4,5) 
rep(x,times=2)
## [1] 1 3 4 5 1 3 4 5
rep(c(2,1),length.out=4,each=2)  #times为x重复次数,each为x中每个元素重复次数,length.out为结果长度(可能出现回收不完全情况) 
## [1] 2 2 1 1
seq(from=1,to=5,by=1)#创建等差数列  
## [1] 1 2 3 4 5
seq_along(x)#输出从 1 到 x 长度的整数序列  
## [1] 1 2 3 4
seq_len(3)#生成从 1 到指定数字 (n) 的整数序列
## [1] 1 2 3

随机数的生成

runif(7)
## [1] 0.04065684 0.22865549 0.21371565 0.16074904 0.10387857 0.90130973 0.83828246
#生成7个随机的单位间隔内均匀分布 
rnorm(1)
## [1] -1.330123
#生成1个标准正态分布 
sample(0:1, 20, replace=TRUE, prob=c(0.9, 0.1)) #replace即有无放回(重复与否),prob即 使得p(X=0)=0.9
##  [1] 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0

可以通过设置种子来重现结果,只要下次生成随机数前设置之前使用过的种子

set.seed(12345) 
sample(1:10, 5, replace=TRUE)
## [1]  3 10  8 10  8

运算

平均值mean()

方差var()

标准差sd()

中位数median()

绝对值abs(c(2,-1,-3,0))

平方sqrt(c(2,4,3,1))

求最小值/最大值

单个最小值min()

跨多个向量逐个元素比较值pmin()

累积最小值cummin()

累积最大值cummax()

求和

向量中元素总和sum()

向量中元素的累计和cumsum()

diff()可看作cumsum的逆

向量中所有元素的乘积prod()

向量中元素的累计乘积cumprod()

cummin(c(3, 2, 4, 5, 1, 6, 0))
## [1] 3 2 2 2 1 1 0
pmin(c(1, 2, 3, 4), c(4, 2, 3, 1))
## [1] 1 2 3 1
min(c(1,3,4,5),c(0,-4,2,5,6))
## [1] -4
diff(c(-2,3,6,2))
## [1]  5  3 -4

四舍五入

取最近的小值 floor()

取最近的大值ceiling()

四舍五入round()

向0靠近trunc()

指数函数

exp()

对数函数

log()

概率分布

连续分布

  • 均匀分布:unif

  • 正态分布:norm

  • 指数:exp

  • 卡方分布:chisp

  • Γ分布:gamma

  • β:beta

  • f分布:f

  • 对数正态:lnorm

前缀:d(概率密度函数)/p(分布函数)/q(分位数函数)/r(产生随机偏差)

离散分布

  • 二项式:binom

  • 几何:geom

  • 泊松:pois

  • 超几何:hyper

  • 负二项式:nbinom

运算符

%/% ` (整数除法)和 ` %% ` (模数,除法余数)

Logical vector

缺失值测试

is.na(c(NA_real_, Inf, -Inf, NaN, -1, 0, 1,NA))
## [1]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE

缺失值的处理

na. omit,其主要目的是从原子向量中去除缺失值,从而得到结果

which(x) 得到不含缺失值的结果

NA | TRUE=TRUE

NA | FALSE=NA

利用sum/mean,求符合条件的值的数目/比例

x<-runif(30)
sum(x>=0.5)
## [1] 13
mean(x>=0.5)
## [1] 0.4333333

ifelse选择元素

ifelse函数是标量if … else条件语句的向量化版本

ifelse(x>=y,x,y)

character vector

转义字符 反斜杠\

  • \"输入双引号,

  • \'输入单引号,

  • \\输入一条反斜杠,

  • \n换行

  • \b删除最后一个

  • \t植入制表符(前进到下一个制表位,例如四个或八个文本列的倍数),

  • \r注入回车符(移至当前行的开头)这意味着后续字符将覆盖当前行内容

print函数中转义符无效

cat函数遵循以上转义符的特殊含义

连接

连接两个或多个字符向量的相应元素paste(x,y,sep)

聚合为一个字符串 paste(x,collapse)

模式匹配

整体匹配
  1. ‘==’

  2. match(x,y) 返回x元素在y中对应元素位置,不存在则返回NA

  3. %in%返回逻辑向量

    c("spam", "spam", "bacon", "eggs") %in% c("spam", "eggs")
    ## [1]  TRUE  TRUE FALSE  TRUE
部分匹配
  1. charmatch(x,y) 返回x元素在y中对应元素位置,不存在则返回NA。返回值存在条件是x是y的子集。0表示模棱两可

  2. startsWith(x,y) 返回逻辑向量,返回true的条件是y是x的子集

模糊匹配
grepl("spam",c("spam", "y spammite spam", "yummy SPAM", "sram"), fixed=TRUE) #fixed=TRUE意味着固定模式
## [1]  TRUE  TRUE FALSE FALSE
agrepl("spam",c("spam", "y spammite spam", "yummy SPAM", "sram"))#近似匹配
## [1]  TRUE  TRUE FALSE  TRUE

正则表达式(grepl参数中perl=TRUE)

一、限定符
a* 出现0/多次
a+ 出现1/多次
a? 出现0/1次
a{n} 出现n次,n=1,2…
二、字符类
[abc]匹配a或者b或者c
{a-c]同上
[a-fA-F0-9]匹配小写大写和数字
[^0-9]匹配除0-9外的所有
三、元字符
\d匹配数字
\w匹配单词(英文数字下划线)
\s匹配空白符(包括换行符、Tab).
\b标注字符的边界
^匹配行首
$匹配行尾
四、
<.+>贪婪匹配任意
<.+?>懒惰匹配任意

定位匹配

regexpr(x,y,fixed=TRUE)在每个字符串中查找指定字符的第一次出现,不出现返回-1

当使用正则表达式搜索指定字符位置时,使用gregexpr(x,y,perl=TRUE)

使用完gregexpr得到位置后,可用regmatches(x,``gregexpr(x,y,perl=TRUE),perl=TRUE) 提取匹配的子字符串

(以上均返回列表)

提取子字符串还可以用substring(x,1,4) 提取位置从1到4的字符串

替换

subgsub分别替换模式中的第一个匹配项和所有匹配项

sub("a","b",x,fixed=TRUE) 将x中的第一个a换成b

gsub("a","b",x,fixed=TRUE)

拆分

strsplit(x,"a",fixed=TRUE) 以字符a为分割

转换

tolower小写←大写

toupper小写→大写

chartr(old,new,x)

List

创建

list()

打印:str()

转换:as.list()

展开:unlist()

NULL

NULL可作为占位符

Null不等同于NA。前者不能放置在原子向量中且无价值

list(NULL, NULL, month.abb)
## [[1]]
## NULL
## 
## [[2]]
## NULL
## 
## [[3]]
##  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
length(NULL)
## [1] 0

测试:is.null()

attr

引入:

structrue(x,attribute1="abcd",attribute2=c(1,2,3,4))

x <- structure(
    1:8,  # the object to be equipped with attributes
    attribute1="value1",
    attribute2=c(6, 100, 324)
)
print(x)
## [1] 1 2 3 4 5 6 7 8
## attr(,"attribute1")
## [1] "value1"
## attr(,"attribute2")
## [1]   6 100 324
attr(x, "attribute1")
## [1] "value1"
attributes(x)
## $attribute1
## [1] "value1"
## 
## $attribute2
## [1]   6 100 324

特殊属性:

  • names,row.names,dimnames(赋值NULL给row.names会将此属性重置为最常见的连续自然数情况)

  • dim

  • levels

  • class, eg.data frame,character…

可通过指定函数访问,如names() class() dim()

不能被赋予任意值

(x <- structure(c(13, 2, 6), names=c("spam", "sausage", "celery")))
##    spam sausage  celery 
##      13       2       6
names(x)
## [1] "spam"    "sausage" "celery"

修改和删除:

`dimnames<-`(A, list(c("a", "b", "c"),c("x", "y", "z", "w")))
attr(x, "attribute1") <-NULL
x
##    spam sausage  celery 
##      13       2       6

Matrix & array

创建

structure(1:6, dim=c(2, 3))
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
matrix(1:6, byrow=TRUE, nrow=2,dimnames=list(c("x", "y"), c("a", "b", "c")))
##   a b c
## x 1 2 3
## y 4 5 6
array(1:6, dim=c(2, 3))
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6

转换

as.matrix(1:2)
##      [,1]
## [1,]    1
## [2,]    2
cbind(1:2)
##      [,1]
## [1,]    1
## [2,]    2
t(1:3)#转置
##      [,1] [,2] [,3]
## [1,]    1    2    3
rbind(1:3)#如果参数中存在一个数据框,则得到数据框。或直接引用cbind.data.frame 和rbind.data.frame
##      [,1] [,2] [,3]
## [1,]    1    2    3

simplify2array为unlist扩展,list内长度不同无法转换

simplify2array(list(1, 11, 21))
## [1]  1 11 21
simplify2array(list(1:3, 11:13, 21:23, 31:33))
##      [,1] [,2] [,3] [,4]
## [1,]    1   11   21   31
## [2,]    2   12   22   32
## [3,]    3   13   23   33

数据整理

table(x[["row.names"]])

a<-c(2, 4, 6, 2, 2, 2, 3, 6, 6, 3)
tabulate(a)
## [1] 0 4 2 1 0 3
数组转置

aperm(a,perm,resize=TRUE)

  • perm: 指定新维度的排列顺序的整数向量。例如,如果 a 是一个三维数组,perm 可以是 c(2, 1, 3) 之类的。

  • resize: 一个逻辑值,默认为 TRUE。如果为 TRUE,结果会被调整为适应新维度。

  • t()区别是一个可以处理多维数组,一个处理矩阵矩阵运算

矩阵运算

对角阵diag(x)

求解线性方程组solve(x,y) x为方程组系数矩阵,y为结果矩阵

矩阵的逆 solve(x)

矩阵行平均rowMeans()

矩阵列平均colMeans()

和同理;

计算矩阵x行间距离dist(x)

矩阵乘法 %*%

数组外积%o%

汇总矩阵中的各个行或列

apply(x,2,fun)

sapply(x,fun,...)

lapply(x,fun,...)

sapply() 简化了输出。如果结果是相同长度的向量列表,则返回一个矩阵。如果结果是单个值的列表,则返回一个向量。

lapply() 始终返回一个列表,而不管所应用的函数的输入或结果如何

Data frame

创建

data.frame(
    a=c(TRUE, FALSE),
    b=1:6,
    c=runif(6),
    d=c("spam", "spam", "eggs")
)
##       a b          c    d
## 1  TRUE 1 0.42919882 spam
## 2 FALSE 2 0.92727397 spam
## 3  TRUE 3 0.77324322 eggs
## 4 FALSE 4 0.25968125 spam
## 5  TRUE 5 0.32122467 spam
## 6 FALSE 6 0.06019516 eggs

字符向量转换为因子

一些与数据框相关的函数会自动将字符向量转换为因子,由参数stringsAsFactors控制

排序行

order() 得到

a<-c(3,1,4,2,5)
o<-order(a) #[1]2 4 1 3 5
a[o]
## [1] 1 2 3 4 5

sort()

得到排序好的结果

range() 返回给定参数的最小值和最大值

range(a)
## [1] 1 5

如参数中含有因子或日期字符串等,运用xtfrm() 转换为数值

处理重复行

duplicated() 得到重复行

unique() 删除重复行

连接合并数据框

merge(x,y)

重塑数据框/数据整理

as.data.frame.table:

A <- matrix(round(runif(6), 2), nrow=3,
    dimnames=list(
        c("X", "Y", "Z"),  # row labels
        c("u", "v")        # column labels
))
names(dimnames(A)) <- c("Row", "Col")
print(A)
##    Col
## Row    u    v
##   X 0.04 0.96
##   Y 0.06 0.83
##   Z 0.63 0.32
as.data.frame.table(A, responseName="Val", stringsAsFactors=FALSE)
##   Row Col  Val
## 1   X   u 0.04
## 2   Y   u 0.06
## 3   Z   u 0.63
## 4   X   v 0.96
## 5   Y   v 0.83
## 6   Z   v 0.32

reshape():还没掌握,既可重塑也可拆栈(逆向操作)

split()根据两个因子类序列的组合进行分区。不存在的水平对 会导致数据框为空

x <- data.frame(
    a=c(    10,     20,     30,     40,     50),
    u=c("spam", "spam", "eggs", "spam", "eggs"),
    v=c(     1,      2,      1,      1,      1)
)
split(x, x["u"]) 
## $eggs
##    a    u v
## 3 30 eggs 1
## 5 50 eggs 1
## 
## $spam
##    a    u v
## 1 10 spam 1
## 2 20 spam 2
## 4 40 spam 1

sapply()聚合分组的数字数据

sapply(split(iris[1:2], iris[5]), sapply, mean)
##              setosa versicolor virginica
## Sepal.Length  5.006      5.936     6.588
## Sepal.Width   3.428      2.770     2.974

aggregate(x,by,FUN)对数据框中的所有列应用单个函数。第二个参数by必须是列表形式(包括数据框),作为数据拆分依据的分组变量

增加修改删除列

1.修改

df<-data.frame(Name=c("jenny","susan","casio"),age=c(18,20,22))
transform(df,age=age+1)
##    Name age
## 1 jenny  19
## 2 susan  21
## 3 casio  23

2.增加

transform(df,birthyear=2024-age)
##    Name age birthyear
## 1 jenny  18      2006
## 2 susan  20      2004
## 3 casio  22      2002
within(df,birthday<-c("0601","0701","0801"))
##    Name age birthday
## 1 jenny  18     0601
## 2 susan  20     0701
## 3 casio  22     0801

复数

Re(x) 复数的实部

Im(x) 复数的虚部

Mod(x) 绝对值(模)

Arg(x) 复数角度

conj(x) 共轭复数

convolve() 卷积(补课学习)

fft() 对array快速傅里叶变化

mvfft() 矩阵各列的快速傅里叶变化

Graphic

1.par(mar=...):调整绘图边距。mar 参数指定绘图底部、左侧、顶部和右侧的边距行数。

多图情况下par(mfrow=c)

2.plot.new()

plot.windows(xlim,ylim,asp=1,xaxs,yaxs) 指定 x 和 y 范围以及纵横比

x轴y轴默认情况下在每个方向上延长4%(xaxs=“r”)

xaxs=“i”时x轴y轴不延长

3.(1)point(x,y,col,pch)

pch:

(2)lines(x,y,type)

type:

(3)text(position1,position2,c("character1","character2"),col="red")

(4)rasterImage(matrix,interpolate=TRUE)

interpolate平滑颜色过渡

(5)polygon(x,y,lty,col,border)

(6)image(x,y,z,col)rasterImage的便捷版本,可轮廓图、二维直方图、热图

  1. plot(x,y,type)

通用的基础函数,用于创建各种绘图和图表,包括散点图、折线图等。

col:

palette() 函数用于查看或设置当前调色板。R 中的调色板是一组颜色

调整颜色透明度:

adjust_transparency <- function(col, alpha)
    rgb(t(col2rgb(col)/255), alpha=alpha)  

col2rgb(col):此功能将颜色col转换为其 RGB 分量(红、绿、蓝)。它返回一个矩阵,其中每行对应于颜色的 RGB 值。

rgb 函数创建具有指定 RGB 值的颜色,alpha 参数设置透明度。

lty:

多边形边界的线型。默认值为 solid

lwd线宽

4.text("character",pos,offset,adj,srt)

pos:标签位置;cex大小;srt文本旋转;offset距离

5.使用box在绘图或图形区域周围绘制矩形

6.使用axis(side,at=seq(2,10,by=2),labels,col,lwd...)添加两个轴上的刻度标签等

side:1x轴 2y轴 3顶部 4右边

at指定刻度的位置

7.使用 title(main,sub,xlab,ylab)添加xy轴的名称

直方图创建hist(data,breaks)

breaks条柱数

条形图创建:barplot(values)

8.legend("position",legend=levels(x),bg="white")

编程

高阶函数

do.call(fun,x)

用于调用列表中指定参数的函数,输出取决于被调用的函数,不一定是列表

Map()

将函数应用于多个列表或向量的相应元素。它返回一个列表

Reduce()

filter()