1
向量化运算符
在之前R语言基础教程——第3章:数据结构——向量中我们介绍过向量的加减乘除运算,在这里介绍一下>,<运算。
> x = c (88,5,12,13)
> y = c (98,3,14,9)
> z = c (90,12,34,45,5,3)
> x > y
[1] FALSE TRUE FALSE TRUE
> x < y
[1] TRUE FALSE TRUE FALSE
> x > z
[1] FALSE FALSE FALSE FALSE TRUE TRUE
Warning message:
In x > z : 长的对象长度不是短的对象长度的整倍数
> b = c (99,3,15,6,14,56,45,12)
> x >= b
[1] FALSE TRUE FALSE TRUE TRUE FALSE FALSE TRUE
>
如果2个向量长度相等,可以用<或>来判断向量中对应元素的大小关系,判断正确为TRUE,否则FALSE。如果长度不相等,也会判断,但会提示警告:长的对象长度不是短的对象长度的整倍数,如果是整数倍不会提示,需要注意。
在这里需要说明的是,x > y运算过程中,x[1]与y[1]运算得FALSE,x[2]与y[2]运算得TRUE,以此类推,得到的所有结果最后还是一个向量。关键在于一个函数使用了向量化的运算符,那么它也被向量化了。这对运算速度有很大的提升。
2
向量输入,矩阵输出
> vector = 1:20
> matrix1 = matrix(vector,ncol=4)
> vector
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
> matrix1
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
>
3
NA和NULL值
在我们获取的实验数据中,有时候会有缺失值,也就是NA。
> age = c(23,34,NA,24,38,34,28,30)
> age
[1] 23 34 NA 24 38 34 28 30
> mean(age)
[1] NA
> mean(age,na.rm = T)
[1] 30.14286
> age2 = c(23,34,NULL,24,38,34,28,30)
> mean(age2)
[1] 30.14286
>
如果数据中用NA值,那么在进行相应的运算时会出错,可通过na.rm = T(意思为移除NA)声明,计算其余的值,而对于NULL,R会自动跳过。
NA和NULL是有区别的,NA会被当成一个元素,NULL是当成不存在的。
> age = c(23,34,NA,24,38,34,28,30)
> age2 = c(23,34,NULL,24,38,34,28,30)
> length(age)
[1] 8
> length(age2)
[1] 7
>
这在矩阵,数据框中的性质是一样的
> matrix1
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> matrix1[1,3] = NA
> matrix1
[,1] [,2] [,3] [,4]
[1,] 1 6 NA 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> mean(matrix1)
[1] NA
> data = as.data.frame(matrix1)#将矩阵转化为数据框
> data
V1 V2 V3 V4
1 1 6 NA 16
2 2 7 12 17
3 3 8 13 18
4 4 9 14 19
5 5 10 15 20
> mean(data)
[1] NA
Warning message:
In mean.default(data) : 参数不是数值也不是逻辑值:回覆NA
> mean(data[4,4])
[1] 19
>
4
筛选
如果要要从大量数据中找出符合一定要求的数据,就得用到R中的筛选功能。
> a = c(1:10)
> w = a[a>5] #获取a中大于5的元素
> w
[1] 6 7 8 9 10
>
我们对向量a使用了>符号,也发生了向量化。这与使用a[c(FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE)]是一样的结果。
> a>5
[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
> a[c(FALSE,FALSE,FALSE,FALSE,FALSE ,TRUE,TRUE,TRUE,TRUE,TRUE)]
[1] 6 7 8 9 10
除了上面这种方式以外,我们还可以通过函数获取。
> a
[1] 1 2 3 4 5 6 7 8 9 10
> subset(a,a<5)
[1] 1 2 3 4
>
subset()函数获取子集时会忽略NA值。而之前通过索引获取时NA值不会被忽略。
> aa = c(2,4,3,6,2,5,8,NA,9,2,4,4,5)
> aa*aa>10 #
[1] FALSE TRUE FALSE TRUE FALSE TRUE TRUE NA TRUE FALSE TRUE TRUE
[13] TRUE
> aa[aa*aa>10]
[1] 4 6 5 8 NA 9 4 4 5
> subset(aa,aa*aa>10)
[1] 4 6 5 8 9 4 4 5
>
这些是直接获取元素的值,倘若我们要获取元素的位置,可以使用which()函数。which()函数统一会忽略NA值。
> which(aa>5)
[1] 4 7 9
>
注意在矩阵和数据框中的使用。
> matrix1
[,1] [,2] [,3] [,4]
[1,] 1 6 NA 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> subset(matrix1,matrix1 > 3) #subset函数不能直接用于矩阵
Error in x[subset & !is.na(subset), vars, drop = drop] :
(下标)逻辑下标太长
> subset(matrix1[,1],matrix1[,1]>3) #指定特定的行或列可以用subset
[1] 4 5
> data
V1 V2 V3 V4
1 1 6 NA 16
2 2 7 12 17
3 3 8 13 18
4 4 9 14 19
5 5 10 15 20
> data>3
V1 V2 V3 V4
[1,] FALSE TRUE NA TRUE
[2,] FALSE TRUE TRUE TRUE
[3,] FALSE TRUE TRUE TRUE
[4,] TRUE TRUE TRUE TRUE
[5,] TRUE TRUE TRUE TRUE
> data[ data>3]
[1] 4 5 6 7 8 9 10 NA 12 13 14 15 16 17 18 19 20
> which(matrix1>4)
[1] 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20
> which(data > 5)
[1] 6 7 8 9 10 12 13 14 15 16 17 18 19 20
>
5
apply()函数的运用
apply(matrix,dimcode = 1,f,fargs)。matrix是一个矩阵,dimcode = 1表示按行运用函数,=2表示按列运用函数。
> matrix1
[,1] [,2] [,3] [,4]
[1,] 1 6 NA 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> apply(matrix1,2,mean) #按列求均值
[1] 3 8 NA 18
> f = function(x) x/2 #定义一个函数
> y = apply(matrix1,1,f)
> y
[,1] [,2] [,3] [,4] [,5]
[1,] 0.5 1.0 1.5 2.0 2.5
[2,] 3.0 3.5 4.0 4.5 5.0
[3,] NA 6.0 6.5 7.0 7.5
[4,] 8.0 8.5 9.0 9.5 10.0
>
matrix1是一个5行4列是矩阵,运用f函数以后发现变成了一个4行5列的矩阵,这是apply函数的默认方式,可用转置函数t()进行转换。
> t(y)
[,1] [,2] [,3] [,4]
[1,] 0.5 3.0 NA 8.0
[2,] 1.0 3.5 6.0 8.5
[3,] 1.5 4.0 6.5 9.0
[4,] 2.0 4.5 7.0 9.5
[5,] 2.5 5.0 7.5 10.0
>
apply函数用于矩阵,lapply()和sapply()用于列表,lapply()返回一个列表,sapply()返回一个向量。
> lapply(list(1:3,25:29),median)
[[1]]
[1] 2
[[2]]
[1] 27
> sapply(list(1:3,25:29),median)
[1] 2 27
6
数据的合并
rbind()和cbind()函数可用于合并数据框或者矩阵的数据。合并数据要求数据具有相同的行或者列。
> m = matrix(1:8,nrow = 4)
> m
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> mf = data.frame(a= 1:5,b = 6:10)
> mf
a b
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
> cbind(m,9:12)
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
> cbind(mf,c = 11:15)
a b c
1 1 6 11
2 2 7 12
3 3 8 13
4 4 9 14
5 5 10 15
> rbind(m,1:2)
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
[5,] 1 2
> rbind(mf,c(66,67))
a b
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
6 66 67
>
7
tapply()函数
> ages = c(25,26,55,37,31,42)
> affils = c("R","D","D","R","U","D")
> tapply(ages,affils,mean)
D R U
41 31 31
>
函数tapply()把向量c("R","D","D","R","U","D")作为具有水平"D","R","U"的因子。
8
split()函数
> g = c("M","F","F","I","M","M","F")
> split(1:7,g)
$F
[1] 2 3 7
$I
[1] 4
$M
[1] 1 5 6
向量g作为因子有三个水平M,F,I,对应到第一水平的索引值为1,5,6,意味着g[1]、g[5]和g[6]具有值"M"。因此输出结果中组件M为向量1:7中的第1,5,6位元素,即c(1,5,6)。
9
by()函数
by(data, INDICES, FUN, ..., simplify = TRUE)
data通常是一个数据库,也可以是一矩阵。INDICES是一个因子或一组因子,每个因子的长度为nrow(数据)。 FUN是要应用于(通常是数据框)data子集的函数。
require(stats)
by(warpbreaks[, 1:2], warpbreaks[,"tension"], summary)
by(warpbreaks[, 1], warpbreaks[, -1],summary)
by(warpbreaks, warpbreaks[,"tension"],
function(x) lm(breaks ~ wool, data = x))
## now suppose we want to extract the coefficients by group
tmp <- with(warpbreaks,
by(warpbreaks, tension,
function(x) lm(breaks ~ wool, data = x)))
sapply(tmp, coef)
aggregate()与cut()函数自学。
本文分享自 MedBioInfoCloud 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!