首页
学习
活动
专区
圈层
工具
发布

R语言基础教程——第3章:数据结构综合运用

数据结构综合运用

1

向量化运算符

在之前R语言基础教程——第3章:数据结构——向量中我们介绍过向量的加减乘除运算,在这里介绍一下>,<运算。

代码语言:javascript
复制
> 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

向量输入,矩阵输出

代码语言:javascript
复制
> 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。

代码语言:javascript
复制
> 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是当成不存在的。

代码语言:javascript
复制
> 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
> 

这在矩阵,数据框中的性质是一样的

代码语言:javascript
复制
> 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中的筛选功能。

代码语言:javascript
复制
> 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)]是一样的结果。

代码语言:javascript
复制
> 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

除了上面这种方式以外,我们还可以通过函数获取。

代码语言:javascript
复制
> a
 [1]  1  2  3  4  5  6  7  8  9 10
> subset(a,a<5)
[1] 1 2 3 4
> 

subset()函数获取子集时会忽略NA值。而之前通过索引获取时NA值不会被忽略。

代码语言:javascript
复制
> 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值。

代码语言:javascript
复制
> which(aa>5)
[1] 4 7 9
> 

注意在矩阵和数据框中的使用。

代码语言:javascript
复制
> 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表示按列运用函数。

代码语言:javascript
复制
> 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()进行转换。

代码语言:javascript
复制
> 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()返回一个向量。

代码语言:javascript
复制
> 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()函数可用于合并数据框或者矩阵的数据。合并数据要求数据具有相同的行或者列。

代码语言:javascript
复制
> 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()函数

代码语言:javascript
复制
> 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()函数

代码语言:javascript
复制
> 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()函数

代码语言:javascript
复制
by(data, INDICES, FUN, ..., simplify = TRUE)

data通常是一个数据库,也可以是一矩阵。INDICES是一个因子或一组因子,每个因子的长度为nrow(数据)。 FUN是要应用于(通常是数据框)data子集的函数。

代码语言:javascript
复制
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()函数自学。

下一篇
举报
领券