在R中,有五种数据类型(元素)
| 元素 | 含义 |
|---|---|
| numeric | 数字(实数) |
| logical | 逻辑型 |
| character | 字符型 |
| complex | 复数 |
x <- 1
as.numeric(x)
## [1] 1
as.logical(x)
## [1] TRUE
as.character(x)
## [1] "1"
as.complex(x)
## [1] 1+0i
向量中只能包含同一类型的对象。
x <- c(1,2,3,4)#用c()来为向量中的个元素进行赋值
x <- 1:4#用:的方式为向量添加等差数列作为向量
x <- vector(mode = "numeric" , length = 4L) #生成的是长度为4的数值型向量,元素都是0,4L代表整数4
矩阵就是向量+维度的属性,可以有不同类型的元素
#创建矩阵
#方案1:调用函数matrix,不输入变量标签的话是按照先列后行的顺序填充
str(matrix)
## function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
m <- matrix(nrow = 2, ncol = 3)
dim(m)#查看维度
## [1] 2 3
attributes(m)#查看矩阵的属性
## $dim
## [1] 2 3
m <- matrix(1:6, nrow = 2, ncol = 3)
m
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
#方案2:用向量加维度的方法
x <- 1:4
dim(x) <- c(2,2)
x
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
#方案3:捆绑向量的方式,分为按行/按列绑定
a <-c(1,1)
b <-c(2,2)
cbind(a,b)
## a b
## [1,] 1 2
## [2,] 1 2
rbind(a,b)
## [,1] [,2]
## a 1 1
## b 2 2
列表也可以包含不同的元素。
#创建列表的方式:
x <- list(1, "a", TRUE, 1 + 4i)
x
## [[1]]
## [1] 1
##
## [[2]]
## [1] "a"
##
## [[3]]
## [1] TRUE
##
## [[4]]
## [1] 1+4i
#或者也可以将列表的元素进行取名:
x <- list(a=c(1,2,3),b=3:5)
x
## $a
## [1] 1 2 3
##
## $b
## [1] 3 4 5
因子是分类的依据,分为有序因子和无序因子。因子之间可以有实质的大小关系,如用1,2,3,4表示大学的四个阶段;也可以无实质的大小关系,如用1,2表示男女。因子是一个整数向量+标签的形式,通常用于回归,如lm(),glm().
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"
attr(x,"levels")#查看标签
## [1] "no" "yes"
以列为单位的,可以想象成SPSS;是个元素长度相同的列表,每个元素代表一列数据,每个元素的长度代表行数,元素类型可以不同 row.names用来标注每个样本的名字 read.table() or read.csv()来创建数据框,或者用data.frame() data.matrix() 将数据框转换为矩阵——可能会转换成同一类型的数据!!
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
row.names(x) <- c("a","b","c","d")
x
## foo bar
## a 1 TRUE
## b 2 TRUE
## c 3 FALSE
## d 4 FALSE
NA or NaN,NaN是NA的一种。
x <- c(1, 2, NA, 10, 3)
is.na(x)#返回是否是NA的逻辑值
## [1] FALSE FALSE TRUE FALSE FALSE
is.nan(x)#返回是否是NaN的逻辑值
## [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中的Frame,**文件名要加双引号**
str(read.table)
## function (file, header = FALSE, sep = "", quote = "\"'", dec = ".",
## numerals = c("allow.loss", "warn.loss", "no.loss"), row.names,
## col.names, as.is = !stringsAsFactors, na.strings = "NA", colClasses = NA,
## nrows = -1, skip = 0, check.names = TRUE, fill = !blank.lines.skip,
## strip.white = FALSE, blank.lines.skip = TRUE, comment.char = "#",
## allowEscapes = FALSE, flush = FALSE, stringsAsFactors = default.stringsAsFactors(),
## fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)
str(read.csv)
## function (file, header = TRUE, sep = ",", quote = "\"", dec = ".",
## fill = TRUE, comment.char = "", ...)
str(readLines)#用于读取文本,在R中返回一个String
## function (con = stdin(), n = -1L, ok = TRUE, warn = TRUE, encoding = "unknown",
## skipNul = FALSE)
str(source)#读取Rcode的函数
## function (file, local = FALSE, echo = verbose, print.eval = echo,
## exprs, spaced = use_file, verbose = getOption("verbose"), prompt.echo = getOption("prompt"),
## max.deparse.length = 150, width.cutoff = 60L, deparseCtrl = "showAttributes",
## chdir = FALSE, encoding = getOption("encoding"), continue.echo = getOption("continue"),
## skip.echo = 0, keep.source = getOption("keep.source"))
str(dget)#读取Rcode,不同的是读取的是逆句法分析过后以文本文件储存的R对象
## function (file, keep.source = FALSE)
str(load)
## function (file, envir = parent.frame(), verbose = FALSE)
str(unserialize)#二进制对象读入R
## function (connection, refhook = NULL)
-dput(): 读取文本的数据 1. 可编辑的(不是很推荐) 2. 长期储存,避免损坏 3. 空间利用率不高,占内存 用dput进行存储,dget来读取写入的R文件,多用于数据的重建
-dump(): 与dput()用法类似,但是可以进行多数据的重建
write.table()
writeLines()
dump()
dput()
save()
serialize()
read.table(默认的分隔符是" ")
read.csv(默认的分隔符是",")
read.table:
| 参数 | 含义 |
|---|---|
| file | 文件的名字,路径 |
| header | 逻辑值,表明文件中第一行是否是表头 |
| sep | 分隔符,数据的分隔符(“,” or “:” or " “) |
| colClass | 非必要的,数据类型。 |
| nRows | 读入的行数 |
| comment.char | 表示注释符,通常是#。设置为空(如果没有注释) |
| skip | 跳过前几行再读取 |
| stringAsFactor | 字符变量是否转换成因子(默认true,可以改成false) |
colClass:告诉R每列的数据类型,可以节省读取时间和内存
initial <- read.table("database.txt" , nrows = 100)
classes <- sallpy(initial, class)
tabAll <- read.table("database.txt" , colClasses = classes)
这时候tabAll就可以用来对大数据进行指定类型,从而减少内存的占用
nrows: 估计大致的读取行数可以帮助计算大致的内容,从而减少内存的占用,可以略多估计一点
Calculating Memory Requirements
rows * columns * 8(bytes/numeric) / 220 (bytes/MB)
系统运行需要的内存,是上述计算的两倍
| 符号 | 用法 |
|---|---|
| [ | 返回的对象和原来的相同:向量的子集还是向量;可以在对象中选择超过一个元素 |
| [[ | 提取list 或data.frame的元素;只能提取单个元素;返回的对象类型不一定是list 或data.frame |
| $ | 有名字的对象 |
x <- list(foo = 1:4, bar = 0.6)
#1. 只有单方括号的返回是列表,双方括号和$的返回数据类型是一样的。
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
#2. 利用单方括号和向量c()来获取多个元素
x <- list(foo = 1:4, bar = 0.6, baz = "hello")
x[c(1, 3)]
## $foo
## [1] 1 2 3 4
##
## $baz
## [1] "hello"
#3. 使用需要计算的索引只有双方括号可以做到,$或者单方括号都不可以
x <- list(foo = 1:4, bar = 0.6, baz = "hello")
name <- "foo"
x[[name]]
## [1] 1 2 3 4
#4. 在list里有多种类型的元素情况下,用双方括号。与第3点比,双方括号里的c(1,3)表示第一个元素的第三个元素;单方括号里的c(1,3)表示了第一个元素和第三个元素。
x <- list(a = list(10, 12, 14), b = c(3.14, 2.81))
x[[c(1, 3)]]
## [1] 14
x[[1]][[3]]
## [1] 14
x <- matrix(1:6, 2, 3)
x[1, 2]
## [1] 3
x[1, 2, drop = FALSE]#利用drop,使得返回是一个矩阵,而非向量
## [,1]
## [1,] 3
x[1, ]
## [1] 1 3 5
通常与双括号,单括号和$一起使用,对于变量名称很长,且前缀唯一的情况。
x <- list(aardvark = 1:5)
x$a
## [1] 1 2 3 4 5
x[["a", exact = FALSE]]
## [1] 1 2 3 4 5
x <- c(1, 2, NA, 4, NA, 5)
#is.na()函数用来返回一个逻辑向量
bad <- is.na(x)
x[!bad]
## [1] 1 2 4 5
#complete.cases()用来返回一个或者多个数据是否是缺失值
x <- c(1, 2, NA, 4, NA, 5)
y <- c("a", "b", NA, "d", NA, "f")
complete.cases(x, y)
## [1] TRUE TRUE FALSE TRUE FALSE TRUE
#complete.cases()的另一个妙用在于剔除含有缺失值的行
x <- c(1,2,3,4,NA,6,7,8,9,10,NA,12)
dim(x) <- c(4,3)
x[complete.cases(x[,3]),]#过滤第三列中有缺失值的数据
## [,1] [,2] [,3]
## [1,] 1 NA 9
## [2,] 2 6 10
## [3,] 4 8 12
x[complete.cases(x),]#过滤所有含有缺失值的数据
## [,1] [,2] [,3]
## [1,] 2 6 10
## [2,] 4 8 12
na.omit(x)#过滤所有含有确实值的数据,但是有其他的内容混杂
## [,1] [,2] [,3]
## [1,] 2 6 10
## [2,] 4 8 12
## attr(,"na.action")
## [1] 1 3
## attr(,"class")
## [1] "omit"
R语言的向量化运算易于相加和做逻辑判断(向量具有可加性,而其他语言需要遍历),可以直接一一对应做计算(数量和逻辑)
x <- matrix(1:4, 2, 2)
y <- matrix(rep(10, 4), 2, 2)
x+y#对应元素一一相加
## [,1] [,2]
## [1,] 11 13
## [2,] 12 14
x>2#对应元素一一判断
## [,1] [,2]
## [1,] FALSE TRUE
## [2,] FALSE TRUE
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