一、数据类型和基本操作
R语言基本原则:语句区分大小写;注释语句以#开头
五类最基本对象:character,numeric,integer,complex,logical,使用class()函数可以查看对象类型;Inf在R中是存在的数,1/0=Inf,1/Inf=0;NaN,即not a number;NAs意为无意义结果
<-为赋值运算符,下面是一些例子:
1
2
3
4
5
6
7
8
9
| > x <- c(0.5, 0.6) ## numeric > x <- c(TRUE, FALSE) ## logical > x <- c(T, F) ## logical > x <- c("a", "b", "c") ## character > x <- 9:29 ## integer(9到29的所有自然数) > x <- c(1+0i, 2+4i) ## complex > y <- c(1.7, "a") ## character("1.7" "a" ) > y <- c(TRUE, 2) ## numeric(1 2) > y <- c("a", TRUE) ## character( "a" "TRUE") |
as.*可以把不同类型的变量转换为*的类型,例如:
1
2
3
4
5
6
7
8
9
10
11
| > x <- 0:6 > class(x) [1] "integer" > as.numeric(x) [1] 0 1 2 3 4 5 6 > as.logical(x) [1] FALSE TRUE TRUE TRUE TRUE TRUE TRUE > as.character(x) [1] "0" "1" "2" "3" "4" "5" "6" > as.complex(x) [1] 0+0i 1+0i 2+0i 3+0i 4+0i 5+0i 6+0i |
创建矩阵,dim()可以表示矩阵行列数:
1
2
3
4
5
| > m <- matrix(1:6, nrow = 2, ncol = 3) > m [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 |
1
2
3
4
5
6
7
8
| > m <- 1:10 > m [1] 1 2 3 4 5 6 7 8 9 10 > dim(m) <- c(2, 5) > m [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 |
列组合(cbind)和行组合(rbind):
1
2
3
4
5
6
7
8
9
10
11
| > x <- 1:3 > y <- 10:12 > cbind(x, y) x y [1,] 1 10 [2,] 2 11 [3,] 3 12 > rbind(x, y) [,1] [,2] [,3] x 1 2 3 y 10 11 12 |
创建向量:v=c(1,3,5,7),vector里面的量必须是同类;列表(Lists)是一类可以包含不同类型对象的向量,用[[]]表示以示区别:
1
2
3
4
5
6
7
8
9
10
| > x <- list(1, "a", TRUE, 1 + 4i) > x [[1]] [1] 1 [[2]] [1] "a" [[3]] [1] TRUE [[4]] [1] 1+4i |
Factors被用来表示分类数据,可以有序或者无序:
1
2
3
4
5
6
7
8
9
10
11
12
| > x <- factor(c("yes", "yes", "no", "yes", "no")) > x [1] yes yes no yes no Levels: no yes > table(x) x no yes 2 3 > unclass(x) [1] 2 2 1 2 1 attr(,"levels") [1] "no" "yes" |
创建数据框(data frame):
1
2
3
4
5
6
7
8
9
10
11
| > x <- data.frame(foo = 1:4, bar = c(T, T, F, F)) > x foo bar 1 1 TRUE 2 2 TRUE 3 3 FALSE 4 4 FALSE > nrow(x) [1] 4 > ncol(x) [1] 2 |
有关丢失值(Missing values):is.na()用来检测NA;is.nan()用来检测NaN;NA值也有类,可能是字符变量、整型等;NaN值是NA值,反之则不然。
1
2
3
4
5
6
7
8
9
10
| > x <- c(1, 2, NA, 10, 3) > is.na(x) [1] FALSE FALSE TRUE FALSE FALSE > is.nan(x) [1] FALSE FALSE FALSE FALSE FALSE > x <- c(1, 2, NaN, NA, 4) > is.na(x) [1] FALSE FALSE TRUE TRUE FALSE > is.nan(x) [1] FALSE FALSE TRUE FALSE FALSE |
为R中的对象起名字:
1
2
3
4
5
6
7
8
9
| > x <- 1:3 > names(x) NULL > names(x) <- c("foo", "bar", "norf") > x foo bar norf 1 2 3 > names(x) [1] "foo" "bar" "norf" |
提取子集:[ 用来提取与原始对象同类的对象,可以选择多个元素(有例外);[[ 可以用来提取列表(list)或者数据框(data frame)中的元素,只能用来提取单一对象;$ 可以以名称来提取列表(list)或者数据框(data frame)中的元素。代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| > x <- c("a", "b", "c", "c", "d", "a") > x[1] [1] "a" > x[2] [1] "b" > x[1:4] [1] "a" "b" "c" "c" > x[x > "a"] [1] "b" "c" "c" "d" > u <- x > "a" > u [1] FALSE TRUE TRUE TRUE TRUE FALSE > x[u] [1] "b" "c" "c" "d" |
1
2
3
4
5
6
7
8
9
10
11
12
13
| > x <- matrix(1:6, 2, 3)#建立一个2行3列的矩阵,1到6的自然数按从上到下、从左到右顺序排列 > x[1, 2]##提取第一行第二列元素 [1] 3 ##这是一个向量 > x[1, 2, drop = FALSE] [,1] [1,] 3 ##加上drop = FALSE变成了1×1矩阵 > x[1, ] ##提取第一行元素 [1] 1 3 5 ##这是一个向量 > x[1, , drop = FALSE] [,1] [,2] [,3] [1,] 1 3 5 ##加上drop = FALSE变成了1×3矩阵 > x[, 2] ##提取第二列元素 [1] 3 4 |
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
| > x <- list(foo = 1:4, bar = 0.6) > x[1] $foo [1] 1 2 3 4 > x[[1]] [1] 1 2 3 4 > x$bar [1] 0.6 > x[["bar"]] [1] 0.6 > x["bar"] $bar [1] 0.6 > x <- list(foo = 1:4, bar = 0.6, baz = "hello") > x1 $foo [1] 1 2 3 4 $baz [1] "hello" > name <- "foo" > x[[name]] ##为“foo”建立索引 [1] 1 2 3 4 > x$name ## “name”元素不存在! NULL > x$foo [1] 1 2 3 4 ## “foo”元素存在 |
1
2
3
4
5
6
7
| > x <- list(aardvark = 1:5) > x$a [1] 1 2 3 4 5 > x[["a"]] NULL > x[["a", exact = FALSE]] ##模糊匹配 [1] 1 2 3 4 5 |
移除丢失值:
1
2
3
4
5
6
7
8
9
10
11
12
13
| > x <- c(1, 2, NA, 4, NA, 5) > bad <- is.na(x) > x[!bad] [1] 1 2 4 5 > x <- c(1, 2, NA, 4, NA, 5) > y <- c("a", "b", NA, "d", NA, "f") > good <- complete.cases(x, y) > good [1] TRUE TRUE FALSE TRUE FALSE TRUE > x[good] [1] 1 2 4 5 > y[good] [1] "a" "b" "d" "f" |
一些常用函数:获取某函数帮助:?functionname;安装软件包:install.packages("packagename");加载软件包:library(packagename);查看属性:attributes(对象名称)
二、矢量化操作
许多在R中的操作经矢量化以后,会使代码更加高效、精确、易读。例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
| > x <- 1:4; y <- 6:9 > x + y [1] 7 9 11 13 > x > 2 [1] FALSE FALSE TRUE TRUE > x >= 2 [1] FALSE TRUE TRUE TRUE > y == 8 [1] FALSE FALSE TRUE FALSE > x * y [1] 6 14 24 36 > x / y [1] 0.1666667 0.2857143 0.3750000 0.4444444 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| > x <- matrix(1:4, 2, 2); y <- matrix(rep(10, 4), 2, 2) > x * y ## 元素相乘 [,1] [,2] [1,] 10 30 [2,] 20 40 > x / y [,1] [,2] [1,] 0.1 0.3 [2,] 0.2 0.4 > x %*% y ## 真正的矩阵乘法 [,1] [,2] [1,] 40 40 [2,] 60 60 |
三、读写数据
将数据读入R的基本函数:
read.table, read.csv, 用于读取表格式数据
readLines, 从文本中读取行
source,读取R代码文件(inverse of dump)
dget, 读取R代码文件(inverse of dput)
load, 从保存的工作空间中读取
unserialize, 为以二进制形式读取单一的R对象
read.table, read.csv, 用于读取表格式数据
readLines, 从文本中读取行
source,读取R代码文件(inverse of dump)
dget, 读取R代码文件(inverse of dput)
load, 从保存的工作空间中读取
unserialize, 为以二进制形式读取单一的R对象
也有类似的将数据写入文件的函数:
write.table
writeLines
dump
dput
save
serialize
write.table
writeLines
dump
dput
save
serialize
read.table是最常用的读取数据的函数,它有几个重要的参数:
file, 文件名称或者连接
header, 如果该文件有标题行,在逻辑上指出
sep, 一个字符串,指示如何对列分隔
colClasses, 指明数据集中的每列类型的特征向量
nrows, 数据集中的行数
comment.char, 表示注释字符的一个字符串
skip, 从开头跳过的行数
stringsAsFactors, 字符变量是否应该视为Factor?
file, 文件名称或者连接
header, 如果该文件有标题行,在逻辑上指出
sep, 一个字符串,指示如何对列分隔
colClasses, 指明数据集中的每列类型的特征向量
nrows, 数据集中的行数
comment.char, 表示注释字符的一个字符串
skip, 从开头跳过的行数
stringsAsFactors, 字符变量是否应该视为Factor?
1
2
3
| data <- read.table("foo.txt") ##"foo.txt"这个文件必须在工作目录内(可以通过File-Change dir...设置) |
由于R是调用电脑的RAM处理数据,所以一般来讲内存越大R崩溃的可能性就越小。如果事先知道对象类型,用colClasses指明对象类型会使R运行速度快两倍。如果数据集很大,最好事先估算需要的空间。例如,有一个1500行120列的数字型的数据框,需要的最小内存为:
1500000×120×8bytes/numeric=1440000000bytes=1440000000÷220bytes/MB=1373.29MB=1.34GB
用readLines从网页中读取数据:
1
2
3
4
5
6
7
8
9
| ##可能花费较长时间 con <- url("http://www.jhsph.edu", "r") x <- readLines(con) > head(x) [1] "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">" [2] "" [3] "<html>" [4] "<head>" [5] "\t<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" |
用文本格式来存储数据非常好,它可编辑性、易修复、能够避免某些潜在的问题。
一些有用的函数:summary()可以用来给出函数的基本特征;str()函数非常有用,可以查看关于对象的属性、数据集预览。
"
[4] ""
[5] "\t
没有弄懂的部分:dput-ting & Dumping R Objects
No comments:
Post a Comment