tags: R 入门 iMooc 数据类型 函数
这是在 imooc 慕课网上听课做的一点内容。目前看来十分没有逻辑。感觉上和matlab挺像,但是一些数据类型还是没有什么概念。
1. 数据类型
查看数据x类型:class(x)
字符(character), 它们常常被引号包围
逻辑类型(logic),TRUE,FALSE和NA,全部大写
复数(complex),1+2i
数值型(numeric),可以是整数或者小鼠
整数(integer),在数字后面加上大写的L
列表(list) S 对象的向量
因子(factor) 常用于标记样本
1.1逻辑向量
>, <, >=, <=,
不等:!=
相等:==
交集(and):&
并集(or):|
1.2 字符型
字符向量也可以用c()
拼接
1.3 产生序列
- rep(a, times = value),重排。
- seq(from = value, to = value, by = value, length = value). 例如,seq(1,10,2),从1开始,步长为2,到10,结果是[1,3,5,7,9]
2. 数据结构
2.1 向量
2.1.1 产生向量
函数vector有两个参数:类型(mode)和长度(length),创建的向量中元素值取决于参数所指定的数据类型:数值型向量则元素值都为0,逻辑型都为FALSE,字符型都为""。以下三个函数有几乎相同的效果(创建一个向量)并且只有一个参数即长度:numeric(),logical(),和character()。
-
vector(mode = 'character', length = 5)
产生一个字符类型的空向量。 -
x1 <- 1:4
产生int向量,[1 2 3 4 ] -
x2 <- c(1,2,3,4)
产生num向量 [1 2 3 4] -
x2 <- c(TRUE,1,'3','a')
产生char向量 ['TRUE','1','3','a'] -
as.character(x)
强制转换类型 -
names(x) <- c('name1','name2','name3')
添加数据标签
2.2 矩阵
- 向量+维度
- 先row,再col
-
attribute(x)
查看属性
2.2.1 产生矩阵
用matrix来创建:matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
选项byrow表示数据给出的值是要按列填充(缺省值)还是按行填充
(如果为TRUE)。可以通过选项dimnames给行列命名。
e = c(1:6)
f = matrix(e,2,3,byrow=TRUE)
f
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
另一种创建矩阵的方法是给维数适当的赋值,这种方法也能改变已有矩阵的维度
> dim(e)
NULL
> dim(e) <- c(2,3)
> e
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> dim(e) <- c(3,2)
> e
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
2.2.2 矩阵拼接
-
rbind(x,x1)
row拼接(纵向) -
cbind(x,x1)
col拼接(横向)
2.2.3 矩阵维度的命名
> dimnames(e) <- list(c('1','2','3'), c('a','b'))
> e
a b
1 1 4
2 2 5
3 3 6
2.3 数组
维度可以到达多维(三维及以上)的矩阵,R中的矩阵只能有2维
创建方法是 x <- array(1:24, dim = c(2,3,4))
2.4 列表(list)
可以包含不同类型的对象,通过双重方括号或者名词来访问
l <- list('a', 2.4, TRUE, 4L, -2)
l <- list(x1 = 'a', x2 = 2.4, x3 = TRUE, x4 = 4L, x5 = -2) # 可以命名,通过l[[2]]或l[['x2']]访问
l <- list(c(1,2,3),c(2,4,5))
2.5 因子
- 处理分类变量。包括顺序变量和命名变量。通过在factor函数中添加参数 order = TRUE来构造顺序变量。
- 整数变量+标签(优于整数变量)。常用于线性模型
一个因子不仅包括分类变量本身,还包括变量不同的可能水平(即使它们在数据中不出现)。因子函数factor用下面的选项创建一个因子:
x <- factor(c('male','male','male','female','female'))
x
[1] male male male female female
Levels: female male
y <- factor(c('male','male','male','female','female'), levels = c('male','female') )
y
[1] male male male female female
Levels: male female # 和x相比,顺序不同。依次编号
factor(x, levels = sort(unique(x), na.last = TRUE), labels = levels, exclude = NA, ordered = is.ordered(x))`
levels 用来指定因子可能的水平(缺省值是向量x中互异的值);labels用来指定水平的名字;exclude表示从向量x中剔除的水平值;ordered是一个逻辑型选项用来指定因子的水平是否有次序。回想数值型或字符型
对因子进行整体性了解,可以使用table(x)
查看因子不同水平的数量。还可以去掉因子的属性levels,使用unclass(x),会变成一个integer的向量。
2.6 缺失值
- NA/NaN, NaN 属于NA,NA不属于NaN
- NaN一般用于数字缺失值,但是NA更广。同时NA有类型属性,如字符型整数型
- 用
is.na()
和is.nan()
判断是否是缺失值
2.7 数据框 data frame
储存表格数据。
可以视为各个元素长度相同的列表
- 每个元素代表1列数据(竖着的1列)
- 每个元素的长度代表行数
- 元素类型可以不同
2.7.1 输入数据框
t <- data.frame(第一列,第二列,...,row.names = ,)
> t <- data.frame(id = c(1,2,3,4),grade = c(70,77,89,90))
> t
id grade
1 1 70
2 2 77
3 3 89
4 4 90
- nrow和ncol可以分辨查看行和列数
- 和矩阵的差别在于,每一列类型可以不同
- 可以用data.matrix()转化为矩阵
2.8 日期和时间(未完待续)
date(),
用as.date()可以把2016-07-20储存为date格式。用weekdays()、montths()、quarters()能分别告诉我们哪一天哪一月哪一季度,julian()
如何选出数据集中的某一个?
如果知道名称name,可以用$name来选出
例如
> x<- data.frame(v1 = 1:3,v2 = c('a','b','c'))
> x
v1 v2
1 1 a
2 2 b
3 3 c
> x$v1
[1] 1 2 3
> x$v1>2
[1] FALSE FALSE TRUE
> x[x$v1>1,]
v1 v2
2 2 b
3 3 c
> x[which(x$v1>1),]
v1 v2
2 2 b
3 3 c
3. apply函数
apply系列函数的基本作用是对数组(array,可以是多维)或者列表(list)按照元素或元素构成的子集合进行迭代,并将当前元素或子集合作为参数调用某个指定函数。vector是一维的array,dataframe可以看作特殊的list。
这些函数间的关系
作用目标 | 在每个元素上应用 | 在子集合上应用 |
---|---|---|
array | apply | tapply |
list | lapply(...) | by |
其中lapply(...)包括一系列函数
lapply
|
| -> 简化版: sapply
| | -> 可设置返回值模板: vapply
| | -> 多变量版: mapply
|
| -> 递归版: rapply
另外vector比较奇怪,vector是一维的array,但是却不全是和array使用相同的函数。在按元素迭代的情况下,使用和list一样的lapply函数;而在按子集合迭代的情况下,tapply和by都能用,只是返回值形式不同。
apply
沿着某一维度进行处理
apply(array, margin, FUN, ...)
在array上,沿margin方向,依次调用FUN。返回值为vector。margin表示数组引用的第几维下标(即array[index1, index2, ...]中的第几个index),1对应为1表示行,2表示列,c(1,2)表示行列。例如 apply(x,2,sum)对列求和。
lapply
循环处理列表中的每一个元素
lapply(列表,函数/函数名,其他参数)
sapply 和lapply一样,只是化简了结果,能用向量就用向量,能用矩阵就用矩阵。
mapply
lapply的多元版本
mapply(函数,数据,参数)以下两句效果是一样的
list(rep(1,4),rep(2,3),rep(4,2),rep(4,1))
mapply(rep,1:4,4:1)
tapply
对向量子集进行操作
tapply(向量,因子/因子列表,函数)
tapply(array, indices, margin, FUN=NULL, ...)
按indices中的值分组,把相同值对应下标的array中的元素形成一个集合,应用到FUN。类似于group by indices的操作。如果FUN返回的是一个值,tapply返回vector;若FUN返回多个值,tapply返回list。vector或list的长度和indices中不同值的个数相等。
当FUN为NULL的时候,返回一个长度和array中元素个数相等的vector,指示分组的结果,vector中相等的元素所对应的下标属于同一组。例如,返回c(1, 2, 1, 3, 2), 表示根据传入的indices,第1、3个元素作为一组,第2、5个元素作为一组,第4个元素作为一组。
例如
x <- c(1:4,2:5,3:6)
f <- gl(3, 4) #产生因子水平(分组),三个因子每因子5个
tapply(x,f,mean)
3.2排序
sort
order 给出排序后的下标,多个标准
x <- data.frame(v1 = 1:5, v2= 2:6, v3 = 3:7)
x[order(x$v1, x$v2),]
3.3总结数据信息
head
tail
summary
str
table
sum
any
all
xtabs 交叉表