在R语言中,向量、矩阵和数组的元素要求必须是同一类型的数据。在使用过程中,可能一个数据对象需要保存不同类型的数据,则可以使用列表(list)来实现。
列表是对象的集合,可以包含向量、矩阵、数组,数据框,甚至是另外一个列表,且在列表中要求每一个成分都要有一个名称。
列表中的对象又称为它的分量(components)
1、创建列表
在R语言中可以使用list()函数来创建列表,其语法格式为:
list(name1=object1, name2 = object2,...)
下面举几个例子来说明R语言中创建列表的方法:
list1
list(studentName=c("小明","小花","小芳","小刚"),major=c("信息管理","财务管理","材料成型"),
score=matrix(c(80,90,75,85,92,83,73,70,69,88,81,89),nrow=3))
运行结果:
$studentName
[1] "小明" "小花" "小芳" "小刚"
$major
[1] "信息管理" "财务管理" "材料成型"
$score
[,1] [,2] [,3] [,4]
[1,]
80
85
73
88
[2,]
90
92
70
81
[3,]
75
83
69
89
2、列表的索引
在R语言中, 访问列表中的元素可以使用双重方括号来指明成分或使用成分的名称及位置来访问。
list1[1] #访问列表中的第1个成分,使用这种方法,返回的结果仍为一个列表
list1[[1]] #访问列表中的第1个成分的元素值,这次仅是元素值,是向量,不再是列表
list1[1:2] #访问列表中的第1个到第2个成分
list1[-1] #排除第一个成
list1$studentName #访问成分名称为studentName的元素值
list1["major"] #访问成分名称为major的成分,其结果仍为一个列表
list1[["major"]] #访问成分名称为major的元素值
list1[c(1,3)] #访问给定的第1和第3个成分
list1[[1]][1]
#访问第一个成分中的第一个值
list1$studentName[1]
#访问第一个成分中的第一个值
list1[["studentName"]][1]
#访问第一个成分中的第一个值
3、列表的编辑
(1)修改某个成分的元素值
list1[[1]][1] = '黄晓明'
list1$studentName[2] = '王花花'
list1[["studentName"]][3] = '袁芳
(2)修改某一成分的所有值
list1$major = c("信息管理","营销管理","工商管理","会计学")
list1[[2]] = c("信息管理","营销管理","工商管理","会计学")
(3)添加一个成分
list1$grade
#实际上,若没有这一列就直接添加
list1
(4)删除某一个成分
list1[4] = NULL
list1$grade = NULL
(5)将列表转换为向量
可以将列表转换为向量,使得向量的元素可以用于进一步的操作。
在将列表转换为向量后,可以应用所有对向量的算术运算。要做这个转换可以使用unlist()函数。
它将列表作为输入并生成一个向量。
(四)数据框
数据框(data.frame)是最常用的数据结构,用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同数据列的数据类型可以相同,也可以不同,但是每列的行数(长度)必须相同。数据框的每列都有唯一的名字,在已创建的数据框上,用户可以添加计算列,这样,R引擎根据同一行的数据列,计算出表达式的值,并把该值作为计算列的值。
1.创建数据框
数据框使用data.frame()函数来创建,格式如下:
data.frame(col1,col2,...,row.name=NULL,check.rows=FALSE,check.names=TRUE,stringsAsFactors=default.stringsAsFactors())
row.name用于指定各行的名称,默认没有名称,使用从1开始自增的序列来标识每一行;check.rows用于来检查行的名称和数量是否一致,默认为False;check.names用来检查变量(列)的名称是否唯一且符合语法,默认为TRUE;用来描述是否将字符型向量自动转换为因子,默认转换,若不改变使用stringAsFactors=FALSE来指定即可。
(1)df1
data.frame(name=c("wang","huang","tang","li"),sex=c("g","b","g","b"),score=c(90,78,90,100))
name sex score
1 wang
g 90
2 huang
b 78
3 tang
g 90
4
li b
100
(2)df1
data.frame(name=c("wang","huang","tang","li"),sex=c("g","b","g","b"),score=c(90,78,90,100),row.names=c("s","d","f","g"))
name sex score
s wang
g 90
d huang
b 78
f tang
g 90
g
li b
100
(3)name
sex
score
df3
data.frame(name,sex,score)
(4) lst
list(name=c("wang","huang","tang","li"),sex=c("g","b","g","b"),score=c(90,78,90,100))
df4
name sex score
1 wang
g 90
2 huang
b 78
3 tang
g 90
4
li b
100
(5) arr1
df5
arr2
array(1:12,c(4,3),dimnames=list(c("R1","R2","R3","R4"),c("C1","C2","C3")))
df6
(6) m1
df7
2.数据框的引用
(1)df1 ["score"] #仍为一个数据框,也是一个列表
(2)df1[, "score"] #返回的是向量
(3) df1[3] #同1
(4)df1[,3] #同2
(5)df1[c(1,3)] #返回第一列和第三列的数据
(6) df1 [c(1,3),] #返回第一行和第三行数据
(7)df1[c(1,3),c(2,3)] #返回第一行和第三行与第二列和第3列交叉处的数据
(8)df1 $name #以因子的形式返回name列
3.数据框的修改
#使用rbind和cbind将新行或新列添加到数据框变量中
# df1$name[1]
#df1
删除第一列和第四列的数据
(五)因子
因子(factor)是R语言中比较特殊的一个数据类型,
它是一个用于存储类别的类型,举个例子,从性别上,可以把人分为:男人和女人,从年龄上划分,又可以把人分为:未成年人(<18岁),成年人(>=18)。R把表示分类的数据称为因子,因子的行为有时像字符串,有时像整数。因子是一个向量,通常情况下,每个元素都是字符类型,也有其他数据类型的元素。因子具有因子水平(Levels),用于限制因子的元素的取值范围,R强制:因子水平是字符类型,因子的元素只能从因子水平中取值,这意味着,因子的每个元素要么是因子水平中的字符(或转换为其他数据类型),要么是缺失值,这是因子的约束,是语法上的规则。
因子在R语言中可以用来表示名义型变量或有序变量。
在统计学中,变量可以分为:区间变量,名义变量和有序变量。
区间变量既可以取连续值的变量,如体重,身高,温度等等。
名义变量一般表示类别,如性别,种族等等。
有序变量是有一定排列顺序的变量,如职称,年级等等。
1.因子的创建
用factor()函数和gl()函数来创建因子变量。
(1)使用factor()函数
函数factor()以一个整数向量的形式储存类别值,整数的取值范围[1...k](其中k是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。
语法格式:
f
factor(x=charactor(),levels,labels=levels,exclude=NA,ordered(x),namax=NA)
其中:
x为创建因子的数据,是一个向量;levels:因子数据的水平,默认是x中不重复的值;labels:标识某水平的名称,与水平一一对应,以方便识别,默认取levels的值;exclude:从x中剔除的水平值,默认NA值;ordered:逻辑值,因子水平是否有顺序(编码次序),若取TRUE,否则取FALSE;nmax:水平个数的限制。
fac1
factor(c(1,2,3,3,1,2,2,3,1,3,2,1))
fac2
factor(rep(1:3,times=2),labels=c("a","b","c"))
grade
c("Freshman","sophome","junior","senior")
fac3
factor(grade,ordered=TRUE)
#对于字符型向量,因子的水平默认依字母顺序创建
fac4
(grade,ordered=TRUE,levels=c("Freshman","sophomore","junior","senior"))
#指定levels,则按levels中的顺序定义数值
结果:
[1] 1 2 3 3 1 2 2 3 1 3 2
1
Levels: 1 2 3
[1] a b c a b c
Levels: a b c
[1] Freshman sophome
junior
senior
Levels: Freshman < junior < senior < sophome
[1] Freshman
junior
senior
Levels: Freshman < sophomore < junior < senior
(2)使用gl()函数
gl()函数用于定义有规律的因子向量,语法格式:
gl(n,k,length=n*k,labels=1:n,ordered=FALSE)
其中参数的含义如下:
n:正整数,表示因子的水平个数
k:正整数,表示每个水平重复的次数
length:正整数,表示因子向量的长度,默认为n*k
labels:表示因子水平的名称,默认值为1:n
ordered:逻辑变量,表示因子水平是否有次序,默认值FALSE
gl
g2
g3
b b c c
2、因子的索引
fac1[1] #访问输出第一个水平
fac1[1:3] #访问输出1 ~3 个水平
fac1[c(1,4,7)] #访问第1,4,7个水平值
fac1 [-c(1:4)] #排除第1~4个
fac1[fac1!=1] #过滤掉等于1的因子水平
fac3 [fac3>"junior"] #对于有序因子 可以使用 >,
>=,
3.因子的修改
fac1[1]
fac[1:3]
fac1[-c(1,4,7)]
(六)缺失值数据
1.处理缺失值的步骤
步骤:
(1)识别缺失数据;
(2)检查导致数据缺失的原因;
(3)删除包含缺失值的实例或用合理的数值代替(插补)缺失值
缺失值数据的分类:
(1)完全随机缺失:若某变量的缺失数据与其他任何观测或未观测变量都不相关,则数据为完全随机缺失(MCAR)。
(2)随机缺失:若某变量上的缺失数据与其他观测变量相关,与它自己的未观测值不相关,则数据为随机缺失(MAR)。
(3)非随机缺失:若缺失数据不属于MCAR或MAR,则数据为非随机缺失(NIMAR)。
2.识别缺失值
NA:代表缺失值;
NaN:代表不可能的值;
Inf:代表正无穷;
-Inf:代表负无穷。
is.na():识别缺失值;
is.nan():识别不可能值;
is.infinite():无穷值。
is.na()、is.nan()和is.infinte()函数的返回值示例
x
is.na(x) is.nan(x)
is.infinite(x)
x
FALSE
x
FALSE
x
FALSE
sum(c(NA,1:49),NA,rm=TRUE) #移除NA数据
NA.omit(a)
#移除NA值所在的行
(七)字符串型
(八)时间与日期