时间: 2018-07-18(学习) 2018-07-22(学习记录)
教程:慕课网 《R语言基础》 讲师:Angelayuan
补充内容: R语言常用函数总结大全、gl()函数
学习内容:课程第四章:重要函数的使用
1.lapply & sapply
如:
str()函数,structure,紧凑地显示对象内部结构,即对象里有什么。
> str(lapply)
function (X, FUN, ...)
> x <- list(a=1:10, b=c(11,21,31,41,51))
> x
$`a`
[1] 1 2 3 4 5 6 7 8 9 10
$b
[1] 11 21 31 41 51
> lapply(x,mean) # 对列表x中的每个元素求平均
$`a`
[1] 5.5
$b
[1] 31
> class(lapply(x,mean))
[1] "list"
可以看出,lapply()函数返回的对象类型为列表。
> x1 <- 1:4 # runif 默认从(0,1)中抽取
> runif(5)
[1] 0.88503752 0.06881155 0.38453875 0.54453272 0.36140365
> lapply(x1, runif)
[[1]]
[1] 0.4489252
[[2]]
[1] 0.4759847 0.4693249
[[3]]
[1] 0.9319213 0.8022253 0.8239708
[[4]]
[1] 0.60829270 0.59905232 0.07741152 0.83186815
> class(lapply(x1, runif))
[1] "list"
可以看出,该程序的实质是对x1中的每一个元素使用runif函数,runif函数中的参数即为x1中的元素内容。返回的对象是一个列表。
> lapply(x1, runif,min=0,max=100)
[[1]]
[1] 77.53334
[[2]]
[1] 19.071435 5.407963
[[3]]
[1] 75.00840 89.83947 19.51815
[[4]]
[1] 66.83073 92.35758 42.35655 30.18025
对x1使用runif函数,”min=0,max=100”作用于runif函数,意思为,使抽取的最小值为0,最大值为100。
> x2 <- list(a=matrix(1:6,2,3),b=matrix(4:7,2,2))
> x2
$`a`
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
$b
[,1] [,2]
[1,] 4 6
[2,] 5 7
> lapply(x2,function(m) m[1,])
$`a`
[1] 1 3 5
$b
[1] 4 6
对x2使用function(m)函数,function(m)函数的作用是抽取m的矩阵的第一行,格式为lapply(对象,函数名 函数内容)。
> sapply(x,mean)
a b
5.5 31.0
> class(sapply(x,mean))
[1] "numeric"
可以看出,sapply函数与lapply的作用基本一致,但所得结果与lapply函数结果相比较为简单。
2.apply
apply函数是对数组对象沿着其某一维度进行数据处理的函数,其格式为:apply(数组/数组名,维度,函数/函数名)。
如:
> x <- matrix(1:16,4,4)
> x
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> apply(x,2,mean) # 对矩阵x的列求平均
[1] 2.5 6.5 10.5 14.5
> apply(x,1,sum) # 对矩阵x的行求和
[1] 28 32 36 40
> class(apply(x,2,mean))
[1] "numeric"
可以看出,apply函数返回的对象是数值型。矩阵的第1个维度为行,第2个维度为列。
rowSums函数、rowMeans函数、colSums函数和colMeans函数是对矩阵进行求平均,求和的函数,作用分别为:对行求和、对行求平均、对列求和、对列求平均。例:
> rowSums(x)
[1] 28 32 36 40
> rowMeans(x)
[1] 7 8 9 10
> colSums(x)
[1] 10 26 42 58
> colMeans(x)
[1] 2.5 6.5 10.5 14.5
> x1 <- matrix(rnorm(100),10,10)
rnorm(100) :从正态总体中抽取100个数。
> x2 <- as.vector(x1)
将x1转化为一个向量,R默认按先列后行的顺序,如果想要按行转化,应输入x2 <-
as.vector(t(x1))[-length(x1)]。
> quantile(x1)
0% 25% 50% 75% 100%
-2.52188938 -0.75854793 0.01278413 0.50218606 2.53157675
> quantile(x2)
0% 25% 50% 75% 100%
-2.52188938 -0.76862008 -0.03151691 0.51595128 2.53157675
可以看出,直接对一个矩阵使用quantile函数,其实质就是对矩阵中所有元素求百分位数,如果想要对每一行或列分别求百分位数,需要使用apply函数。
对x1的每行分别求25%分位点和75%分位点:
> apply(x1,1,quantile,probs=c(0.25,0.75))
[,1] [,2] [,3] [,4] [,5] [,6]
25% -0.7858875 -0.2201546 -0.6949031 -0.5816118 -0.8659978 -0.8314179
75% 0.1181953 0.3378439 0.4806605 0.5125266 0.3238839 0.4293929
[,7] [,8] [,9] [,10]
25% -1.0360972 -0.5325346 -0.8300560 -0.6952302
75% 0.3289841 1.3373911 0.8246093 1.1712271
> class(apply(x1,1,quantile,probs=c(0.25,0.75)))
[1] "matrix"
> x2 <- array(rnorm(2*3*4),c(2,3,4))
> apply(x2,c(1,2),mean)
[,1] [,2] [,3]
[1,] -0.1303495 -0.15920508 -0.3258256
[2,] -0.4381158 -0.03596368 -0.1235411
> apply(x2,c(1,3),mean)
[,1] [,2] [,3] [,4]
[1,] 0.1140517 0.6003327 -0.15505303 -1.3798382
[2,] -0.7958814 0.1819626 0.07241478 -0.2553234
> apply(x2,c(2,3),mean)
[,1] [,2] [,3] [,4]
[1,] -0.005381797 0.63799949 -0.5805872 -1.1889610
[2,] -0.832683878 0.54533972 0.7107023 -0.8136957
[3,] -0.184678873 -0.00989629 -0.2540725 -0.4500857
3.mapply
mapply是lapply的多元版本,格式为:mapply(函数/函数名,数据,函数相关的参数)。
如:
> list(rep(1,4),rep(2,3),rep(3,2),rep(4,1))
[[1]]
[1] 1 1 1 1
[[2]]
[1] 2 2 2
[[3]]
[1] 3 3
[[4]]
[1] 4
> mapply(rep,1:4,4:1)
[[1]]
[1] 1 1 1 1
[[2]]
[1] 2 2 2
[[3]]
[1] 3 3
[[4]]
[1] 4
可以看出,使用该程序生成列表与直接使用list函数套用rep函数返回的结果是一样的,mapply函数中第一个参数是 rep函数,第二个参数是rep函数的第一个参数,即返回对象的数据内容,第三个参数是rep函数的第二个参数,即重复次数。
建立一个函数,函数名为s,有三个参数,内容是从随机总体中抽取n个数,函数的第一个参数是抽取的数据的数量n,第二、三个参数分别是总体的均值和方差:
> s <- function(n, mean, std)
{
rnorm(n, mean, std)
}
> s(4,0,10)
[1] 6.187130 12.654355 6.864007 -5.914964
> mapply(s,1:5,5:1,2)
[[1]]
[1] 4.391382
[[2]]
[1] 6.527374 5.407532
[[3]]
[1] 3.110394 2.861490 1.062697
[[4]]
[1] 1.0589855 0.4850307 1.8892080 2.5943264
[[5]]
[1] 1.4702287 -0.6490873 3.1964053 3.4455908 2.3174738
> class(mapply(s,1:5,5:1,2))
[1] "list"
可以看出,上述程序的作用是生成一个列表,第一个元素是从均值为1,标准差为2的随机总体中抽取1个数,第二个元素是从均值为2,标准差为2的随机总体中抽取2个数。
> list(s(1,5,2),s(2,4,2),s(3,3,2),s(4,2,2),s(5,1,2))
[[1]]
[1] 2.974112
[[2]]
[1] 7.391563 2.021349
[[3]]
[1] 1.011845 5.978735 5.310789
[[4]]
[1] 4.662467 1.260659 3.953015 3.240760
[[5]]
[1] 3.8650932 -0.4452322 1.4689271 0.8915785 0.2668686
4.tapply
tapply函数对向量的子集进行操作,格式为:tapply(向量,因子/因子列表,函数/函数名)。
如:
> x <- c(rnorm(5),runif(5),rnorm(5,1))
> x
[1] 0.59968952 -0.43799554 -1.88220634 -0.01000788 -1.40232262 0.21686806
[7] 0.67216713 0.87636971 0.81726776 0.16794590 0.67250517 0.80001548
[13] -0.11893751 1.80148422 1.95975380
x为一个向量,其中前五个数来自于正态分布,中间五个来自于均匀分布,最后五个来自于均值为1,标准差为0的正态分布
按级别对x进行求均值,x的级别与f中各级别位置一一对应,即每5个数为一个级别,gl函数的具体用法在本文附录部分有补充。例:
> f <- gl(3,5) # 生成三个级别,每个级别5个数
> f
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Levels: 1 2 3
> class(f)
[1] "factor"
> tapply(x,f,mean)
1 2 3
-0.6265686 0.5501237 1.0229642
> tapply(x,f,mean,simplify = FALSE)
$`1`
[1] -0.6265686
$`2`
[1] 0.5501237
$`3`
[1] 1.022964
tapply函数默认生成紧凑形式,在函数中添加参数”simplify = FALSE”可以得到一个没有化简的列表。
> class(tapply(x,f,mean))
[1] "array"
> class(tapply(x,f,mean,simplify = FALSE))
[1] "array"
可以看出,不管是不是紧凑格式,tapply函数生成的均为数组。
5.分类(split函数)
split函数根据因子或因子列表将向量或其他对象分组,通常用与lapply函数一起使用,格式为split(向量/列表/数据框,因子/因子列表)。
如:
> x <- c(rnorm(5),runif(5),rnorm(5,1))
> x
[1] 1.52483675 0.13324386 -1.78415881 -0.32646306 0.94922664 0.08602672
[7] 0.16865164 0.21825480 0.32657114 0.21307498 3.59512887 2.77402661
[13] 1.16457362 0.29169987 -0.38259887
> f <- gl(3,5)
> split(x,f)
$`1`
[1] 1.5248367 0.1332439 -1.7841588 -0.3264631 0.9492266
$`2`
[1] 0.08602672 0.16865164 0.21825480 0.32657114 0.21307498
$`3`
[1] 3.5951289 2.7740266 1.1645736 0.2916999 -0.3825989
使用split函数对x进行分类,按与f中水平元素一一对应的方法进行分类。
> class(split(x,f))
[1] "list"
可以看出,使用split函数进行分类,返回的对象类型是列表
lapply函数与split函数结合使用,split函数返回的列表中的元素分别求平均:
> lapply(split(x,f),mean)
$`1`
[1] 0.09933708
$`2`
[1] 0.2025159
$`3`
[1] 1.488566
> sapply(split(x,f),mean)
1 2 3
0.09933708 0.20251586 1.48856602
> head(airquality)
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
将airquality数据集按月份进行分类:
> s <- split(airquality,airquality$Month)
> s
$`5`
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
7 23 299 8.6 65 5 7
8 19 99 13.8 59 5 8
9 8 19 20.1 61 5 9
10 NA 194 8.6 69 5 10
11 7 NA 6.9 74 5 11
12 16 256 9.7 69 5 12
13 11 290 9.2 66 5 13
14 14 274 10.9 68 5 14
15 18 65 13.2 58 5 15
16 14 334 11.5 64 5 16
17 34 307 12.0 66 5 17
18 6 78 18.4 57 5 18
19 30 322 11.5 68 5 19
20 11 44 9.7 62 5 20
21 1 8 9.7 59 5 21
22 11 320 16.6 73 5 22
23 4 25 9.7 61 5 23
24 32 92 12.0 61 5 24
25 NA 66 16.6 57 5 25
26 NA 266 14.9 58 5 26
27 NA NA 8.0 57 5 27
28 23 13 12.0 67 5 28
29 45 252 14.9 81 5 29
30 115 223 5.7 79 5 30
31 37 279 7.4 76 5 31
$`6`
Ozone Solar.R Wind Temp Month Day
32 NA 286 8.6 78 6 1
33 NA 287 9.7 74 6 2
34 NA 242 16.1 67 6 3
35 NA 186 9.2 84 6 4
36 NA 220 8.6 85 6 5
37 NA 264 14.3 79 6 6
38 29 127 9.7 82 6 7
39 NA 273 6.9 87 6 8
40 71 291 13.8 90 6 9
41 39 323 11.5 87 6 10
42 NA 259 10.9 93 6 11
43 NA 250 9.2 92 6 12
44 23 148 8.0 82 6 13
45 NA 332 13.8 80 6 14
46 NA 322 11.5 79 6 15
47 21 191 14.9 77 6 16
48 37 284 20.7 72 6 17
49 20 37 9.2 65 6 18
50 12 120 11.5 73 6 19
51 13 137 10.3 76 6 20
52 NA 150 6.3 77 6 21
53 NA 59 1.7 76 6 22
54 NA 91 4.6 76 6 23
55 NA 250 6.3 76 6 24
56 NA 135 8.0 75 6 25
57 NA 127 8.0 78 6 26
58 NA 47 10.3 73 6 27
59 NA 98 11.5 80 6 28
60 NA 31 14.9 77 6 29
61 NA 138 8.0 83 6 30
$`7`
Ozone Solar.R Wind Temp Month Day
62 135 269 4.1 84 7 1
63 49 248 9.2 85 7 2
64 32 236 9.2 81 7 3
65 NA 101 10.9 84 7 4
66 64 175 4.6 83 7 5
67 40 314 10.9 83 7 6
68 77 276 5.1 88 7 7
69 97 267 6.3 92 7 8
70 97 272 5.7 92 7 9
71 85 175 7.4 89 7 10
72 NA 139 8.6 82 7 11
73 10 264 14.3 73 7 12
74 27 175 14.9 81 7 13
75 NA 291 14.9 91 7 14
76 7 48 14.3 80 7 15
77 48 260 6.9 81 7 16
78 35 274 10.3 82 7 17
79 61 285 6.3 84 7 18
80 79 187 5.1 87 7 19
81 63 220 11.5 85 7 20
82 16 7 6.9 74 7 21
83 NA 258 9.7 81 7 22
84 NA 295 11.5 82 7 23
85 80 294 8.6 86 7 24
86 108 223 8.0 85 7 25
87 20 81 8.6 82 7 26
88 52 82 12.0 86 7 27
89 82 213 7.4 88 7 28
90 50 275 7.4 86 7 29
91 64 253 7.4 83 7 30
92 59 254 9.2 81 7 31
$`8`
Ozone Solar.R Wind Temp Month Day
93 39 83 6.9 81 8 1
94 9 24 13.8 81 8 2
95 16 77 7.4 82 8 3
96 78 NA 6.9 86 8 4
97 35 NA 7.4 85 8 5
98 66 NA 4.6 87 8 6
99 122 255 4.0 89 8 7
100 89 229 10.3 90 8 8
101 110 207 8.0 90 8 9
102 NA 222 8.6 92 8 10
103 NA 137 11.5 86 8 11
104 44 192 11.5 86 8 12
105 28 273 11.5 82 8 13
106 65 157 9.7 80 8 14
107 NA 64 11.5 79 8 15
108 22 71 10.3 77 8 16
109 59 51 6.3 79 8 17
110 23 115 7.4 76 8 18
111 31 244 10.9 78 8 19
112 44 190 10.3 78 8 20
113 21 259 15.5 77 8 21
114 9 36 14.3 72 8 22
115 NA 255 12.6 75 8 23
116 45 212 9.7 79 8 24
117 168 238 3.4 81 8 25
118 73 215 8.0 86 8 26
119 NA 153 5.7 88 8 27
120 76 203 9.7 97 8 28
121 118 225 2.3 94 8 29
122 84 237 6.3 96 8 30
123 85 188 6.3 94 8 31
$`9`
Ozone Solar.R Wind Temp Month Day
124 96 167 6.9 91 9 1
125 78 197 5.1 92 9 2
126 73 183 2.8 93 9 3
127 91 189 4.6 93 9 4
128 47 95 7.4 87 9 5
129 32 92 15.5 84 9 6
130 20 252 10.9 80 9 7
131 23 220 10.3 78 9 8
132 21 230 10.9 75 9 9
133 24 259 9.7 73 9 10
134 44 236 14.9 81 9 11
135 21 259 15.5 76 9 12
136 28 238 6.3 77 9 13
137 9 24 10.9 71 9 14
138 13 112 11.5 71 9 15
139 46 237 6.9 78 9 16
140 18 224 13.8 67 9 17
141 13 27 10.3 76 9 18
142 24 238 10.3 68 9 19
143 16 201 8.0 82 9 20
144 13 238 12.6 64 9 21
145 23 14 9.2 71 9 22
146 36 139 10.3 81 9 23
147 7 49 10.3 69 9 24
148 14 20 16.6 63 9 25
149 30 193 6.9 70 9 26
150 NA 145 13.2 77 9 27
151 14 191 14.3 75 9 28
152 18 131 8.0 76 9 29
153 20 223 11.5 68 9 30
> table(airquality$Month)
5 6 7 8 9
31 30 31 31 30
可以看出,对数据集中每一月的数量进行统计,其实质是计算Month对应的列中不同值出现的次数。
对s中每一元素分别求列平均:
> lapply(s,function(x) colMeans(x[,c("Ozone","Wind","Temp")]))
$`5`
Ozone Wind Temp
NA 11.62258 65.54839
$`6`
Ozone Wind Temp
NA 10.26667 79.10000
$`7`
Ozone Wind Temp
NA 8.941935 83.903226
$`8`
Ozone Wind Temp
NA 8.793548 83.967742
$`9`
Ozone Wind Temp
NA 10.18 76.90
> sapply(s,function(x) colMeans(x[,c("Ozone","Wind","Temp")]))
5 6 7 8 9
Ozone NA NA NA NA NA
Wind 11.62258 10.26667 8.941935 8.793548 10.18
Temp 65.54839 79.10000 83.903226 83.967742 76.90
> sapply(s,function(x) colMeans(x[,c("Ozone","Wind","Temp")],na.rm = TRUE))
5 6 7 8 9
Ozone 23.61538 29.44444 59.115385 59.961538 31.44828
Wind 11.62258 10.26667 8.941935 8.793548 10.18000
Temp 65.54839 79.10000 83.903226 83.967742 76.90000
R默认对与含有缺失值的数据无法求平均值,即所得结果为缺失值,在函数中加入参数” na.rm = TRUE “,计算平均值时返回对象是对除确实值以外的值求平均值。
6.排序(sort函数 & order函数 &rank函数)
如:
> x <- data.frame(v1=1:5, v2=c(10,7,9,6,8), v3=11:15, v4=c(1,1,2,2,1))
> x
v1 v2 v3 v4
1 1 10 11 1
2 2 7 12 1
3 3 9 13 2
4 4 6 14 2
5 5 8 15 1
> sort(x$v2)
[1] 6 7 8 9 10
> class(x$v2)
[1] "numeric"
> sort(x$v2, decreasing = TRUE)
[1] 10 9 8 7 6
可以使用sort函数对数据进行排序,返回排序后的数据,例子中是对x的v2列进行排序,返回对象内容只有进行排序的部分,该函数默认为升序,使用降序需在函数中加入参数” decreasing = TRUE “。
order函数返回的结果是排序后的数据在原数据中的下标,在排序依据前加”-“或” decreasing = TRUE “可以按照降序进行排序。例:
> order(x$v2)
[1] 4 2 5 3 1
> order(-x$v2)
[1] 1 3 5 2 4
> class(order(x$v2))
[1] "integer"
将数据框x按v2进行升序排列:
> x[order(x$v2),]
v1 v2 v3 v4
4 4 6 14 2
2 2 7 12 1
5 5 8 15 1
3 3 9 13 2
1 1 10 11 1
在order中的排序依据可以有多个,排序时按排序依据输入的先后顺序进行排序。例:
> class(x[order(x$v2),])
[1] "data.frame"
> x[order(x$v4,x$v2),]
v1 v2 v3 v4
2 2 7 12 1
5 5 8 15 1
1 1 10 11 1
4 4 6 14 2
3 3 9 13 2
> x[order(x$v4,x$v2,decreasing = TRUE),]
v1 v2 v3 v4
3 3 9 13 2
4 4 6 14 2
1 1 10 11 1
5 5 8 15 1
2 2 7 12 1
rank函数返回原数据的次序号。例:
> rank(x$v2)
[1] 5 2 4 1 3
7.总结数据信息
如:
使用head函数和tail函数,如果函数中参数只有用数据集名,则R默认显示行数为6,如果想要更改显示行数,需要在数据集名后加上想要返回的对象的行数。例:
> head(airquality) # 返回数据集的前6行
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
> tail(airquality) # 返回数据集的后6行
Ozone Solar.R Wind Temp Month Day
148 14 20 16.6 63 9 25
149 30 193 6.9 70 9 26
150 NA 145 13.2 77 9 27
151 14 191 14.3 75 9 28
152 18 131 8.0 76 9 29
153 20 223 11.5 68 9 30
> head(airquality,10) #返回数据集的前10行
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
7 23 299 8.6 65 5 7
8 19 99 13.8 59 5 8
9 8 19 20.1 61 5 9
10 NA 194 8.6 69 5 10
使用summary函数可以返回数据集按每一列进行的统计信息,即最小值、第一分位点、中位数、均值、第三分位点、最大值和缺失值的数量。例:
> summary(airquality) # 显示数据集的主要信息
Ozone Solar.R Wind Temp
Min. : 1.00 Min. : 7.0 Min. : 1.700 Min. :56.00
1st Qu.: 18.00 1st Qu.:115.8 1st Qu.: 7.400 1st Qu.:72.00
Median : 31.50 Median :205.0 Median : 9.700 Median :79.00
Mean : 42.13 Mean :185.9 Mean : 9.958 Mean :77.88
3rd Qu.: 63.25 3rd Qu.:258.8 3rd Qu.:11.500 3rd Qu.:85.00
Max. :168.00 Max. :334.0 Max. :20.700 Max. :97.00
NA's :37 NA's :7
Month Day
Min. :5.000 Min. : 1.0
1st Qu.:6.000 1st Qu.: 8.0
Median :7.000 Median :16.0
Mean :6.993 Mean :15.8
3rd Qu.:8.000 3rd Qu.:23.0
Max. :9.000 Max. :31.0
对数据集使用str函数,可以得到数据的观测量,各列的类型及内容。例:
str(airquality)
‘data.frame’: 153 obs. of 6 variables:
Ozone:int41361218NA2823198NA… O z o n e : i n t 41 36 12 18 N A 28 23 19 8 N A … Solar.R: int 190 118 149 313 NA NA 299 99 19 194 …
Wind:num7.4812.611.514.314.98.613.820.18.6… W i n d : n u m 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 … Temp : int 67 72 74 62 56 66 65 59 61 69 …
Month:int5555555555… M o n t h : i n t 5 5 5 5 5 5 5 5 5 5 … Day : int 1 2 3 4 5 6 7 8 9 10 …
> table(airquality$Month)
5 6 7 8 9
31 30 31 31 30
> table(airquality$Ozone)
1 4 6 7 8 9 10 11 12 13 14 16 18 19 20 21 22 23 24
1 1 1 3 1 3 1 3 2 4 4 4 4 1 4 4 1 6 2
27 28 29 30 31 32 34 35 36 37 39 40 41 44 45 46 47 48 49
1 3 1 2 1 3 1 2 2 2 2 1 1 3 2 1 1 1 1
50 52 59 61 63 64 65 66 71 73 76 77 78 79 80 82 84 85 89
1 1 2 1 1 2 1 1 1 2 1 1 2 1 1 1 1 2 1
91 96 97 108 110 115 118 122 135 168
1 1 2 1 1 1 1 1 1 1
> table(airquality$Ozone,useNA = "ifany")
1 4 6 7 8 9 10 11 12 13 14 16 18 19 20
1 1 1 3 1 3 1 3 2 4 4 4 4 1 4
21 22 23 24 27 28 29 30 31 32 34 35 36 37 39
4 1 6 2 1 3 1 2 1 3 1 2 2 2 2
40 41 44 45 46 47 48 49 50 52 59 61 63 64 65
1 1 3 2 1 1 1 1 1 1 2 1 1 2 1
66 71 73 76 77 78 79 80 82 84 85 89 91 96 97
1 1 2 1 1 2 1 1 1 1 2 1 1 1 2
108 110 115 118 122 135 168
1 1 1 1 1 1 1 37
可以看出,table函数默认不统计缺失值的数量,在函数中加入” useNA = “ifany”
“可以对缺失值的数量进行统计。
在table函数中输入多个参数,可以对多个参数对应的内容进行交叉统计 。例:
> table(airquality$Month,airquality$Day)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
9 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
29 30 31
5 1 1 1
6 1 1 0
7 1 1 1
8 1 1 1
9 1 1 0
any函数,函数中的参数的内容存在真,则函数返回真。例:
> any(is.na(airquality$Ozone))
[1] TRUE
sum函数,返回函数中参数内容中为真的数量,例:
> sum(is.na(airquality$Ozone))
[1] 37
all函数,函数中参数的内容均为真,则返回真。例:
> all(is.na(airquality$Ozone))
[1] FALSE
> all(airquality$Month<12)
[1] TRUE
> titanic <- as.data.frame(Titanic)
> head(titanic)
Class Sex Age Survived Freq
1 1st Male Child No 0
2 2nd Male Child No 0
3 3rd Male Child No 35
4 Crew Male Child No 0
5 1st Female Child No 0
6 2nd Female Child No 0
> dim(titanic)
[1] 32 5
可以看出,数据框titanic中有32行,5列。
> summary(titanic)
Class Sex Age Survived Freq
1st :8 Male :16 Child:16 No :16 Min. : 0.00
2nd :8 Female:16 Adult:16 Yes:16 1st Qu.: 0.75
3rd :8 Median : 13.50
Crew:8 Mean : 68.78
3rd Qu.: 77.00
Max. :670.00
> x <- xtabs(Freq ~ Class + Age, data=titanic)
> x
Age
Class Child Adult
1st 6 319
2nd 24 261
3rd 79 627
Crew 0 885
使用xtabs函数可以生成交叉表,该例子返回的是数据框titanic中Class和Age的频率的交叉表。
> ftable(x)
Age Child Adult
Class
1st 6 319
2nd 24 261
3rd 79 627
Crew 0 885
可以看出,ftable函数返回的结果与上述使用xtabs函数返回的结果一致,只是表格更为清晰。
object.size函数返回数据集的大小:
> class(x)
[1] "xtabs" "table"
> class(ftable(x))
[1] "ftable"
> object.size(airquality)
5632 bytes
object.size函数返回的数据集大小的单位我们并不熟悉,套用print函数,将原本不熟悉的单位转为我们熟悉的单位”Kb”。例:
> print(object.size(airquality), units="Kb")
5.5 Kb
> class(object.size(airquality))
[1] "object_size"
> class(print(object.size(airquality), units="Kb"))
5.5 Kb
[1] "object_size"
附录
附录1:常用函数的使用
1.数学函数
abs():绝对值
sqrt():平方根
ceiling(x):不小于x的最小整数
floor(x):不大于x的最大整数
round(x, digits=n):将x舍入为指定位的小数
signif(x, digits=n):将X舍入为指定的有效数字位数
2.统计函数
mean(x):平均值
median(x) :中位数
sd(x):标准差
var(x):方差
quantile(x, probs):求分位数,x为待求分位数的数值型向量,probs是一个由[0,1]的概率值组成的数值型向量
range(x):求值域
sum(x):求和
min(x):求最小值
max(x):求最大值
scale(x, center=TRUE,scale=TRUE):以数据对象x按列进行中心化或标准化,center=TRUE表示数据中心化,scale=TRUE表示数据标准化
diff(x, lag=n):滞后差分,lag用以指定滞后几项,默认为1
difftime(time1,time2,units=c(“auto”,”secs”,”mins”,”hours”,”days”,”weeks”)):计算时间间隔,并以星期,天,时,分,秒来表示
3.概率函数
分布名称:缩写
beta分布:beta
二项分布:binom
柯西分布:Cauchy
卡方分布:chisp
指数分布:exp
F分布:f
gamma分布:gamma
几何分布:geom
超几何分布:hyper
对数正态分布:lnorm
logistics分布:logis
多项分布:multinom
负二项分布:nbinom
正态分布:norm
泊松分布:pois
Wilcoxon分布:signrank
t分布:t
均匀分布:unif
weibull分布:weibull
Wilcoxon秩和分布:Wilcox
在R中,函数函数行如:[x][function]。其中x表示指分布的某一方面,function表示分布名称的缩写。
d->密度函数(density)
p->分布函数(distribution function)
q->分位数函数(quantile function)
r->生成随机数函数
4.字符处理函数
nchar: 计算字符数量
substr(x,start,stop):提取或替换一个字符向量中的字串
grep():正则表达式函数,用于查找。
sub():正则表达式函数,用于替换
strsplit(x,split,fixed=FALSE):在splits处分隔字符向量x中的元素
paste( ):连接字符串,sep为分隔符
toupper( ) :小写字母转大写
tolower( ) :大写字母转小写
5.其他实用函数
length(x):获取对象x的长度
sep(fom,to,by):生成一个从from到to间隔为by的序列
rep(x,n:将x重复n遍
cut(x,n):将x分隔为有着N个水平的因子
pretty(x,n):创建分割点,将x分隔成n个区间
cat(x,file,append):连接x对象,并将其输出到屏幕或文件中。
rownames():修改行数据框行变量名
colnames :修改行数据框列变量名
cbind:根据列进行合并,前提是所有数据行数相等。
rbind :根据行进行合并,要求所有数据列数是相同的才能用rbind.
runif(n, min, max ):生成n个大于min,小于max的随机数
rnorm(n, mean, sd ) :生成n个平均数为mean,标准差为sd的随机数
附录2
gl()函数的使用
格式:gl(n, k, length = n*k, labels = 1:n, ordered = FALSE)
其中,参数n表示整数的级别(因子)数;参数k表示一个整数,重复数;length表示一个整数,结果的长度;labels表示可选的向量因子水平的标签;ordered表示一个逻辑表明是否排序
返回值为 因子长度从1到n,k为length组复制的每个值。