Thursday, September 4, 2014

R学习笔记(一)

一、数据类型和基本操作

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对象
也有类似的将数据写入文件的函数:
write.table
writeLines
dump
dput
save
serialize
read.table是最常用的读取数据的函数,它有几个重要的参数:
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