R语言数据对象与运算
R语言数据对象与运算 笔记整理
2.1 数据对象及类型
R语言创建和控制的实体被称为对象(object)
ls()命令来查看当前系统里的数据对象
R对象的名称必须以一个英文字母打头,并由一串大小写字母、数字或钟点组成
注意:R区分大小写
不要用R的内置函数名称作为数据对象的名称,如c、length等
2.2 数据对象类型
R语言的对象包括
数值型(numeric):实数, 可写成整数(integers)、小数(decimal fractions)、科学记数(scientific notation)
逻辑型(logical):T(true)或F(FALSE)
字符型(character):夹在" "或之间
复数型(complex):形如a+bi
原味型(raw):以
二进制形式保存数据
缺省型(missing value):有些统计资料是不完整的,当一个元素或值在统计的时候是“不可得到(not available)”或“缺失值(missing value)”的时候,相关位置可能会被保留并赋予一个特定的NA(not available)值,任何NA的运算结果都是NA。
辨别和转换数据对象类型的函数:
辨别 转换
character is.character() as,character()
complex
double
integer
logical
NA
numeric
2.3 数据对象构造
R语言里的数据对象主要有六种构造:向量(vector)、矩阵(matrix)、数组(array)、列表(list)、数据框(data frames)、因子(factor)
2.3.1 向量(vector)是由有相同基本类型元素组成的序列,相当于一维数组
5个数值组成的向量x,这是一个用函数c()完成的赋值语句,这里c()可以有任意多个参数,而它输出的值则是一个把这些参数首尾相连形成的一个向量
R的赋值符号除了“<-”外,还有"->""="
例如:
> c(1,3,5,7,9) -> y
> y
[1] 2 5 8 3
> z = c(1,3,5,7,9)
> z
[1] 1 3 5 7 9
assign()函数对向量进行赋值
length():可返回向量的长度
mode()可返回向量的
数据类型 正则序列 用 “:”符号,可产生有规律的正则序列(: 的运算级别最高)
函数seq()产生有规律的各种序列
seq(from,to ,by) from 给序列的起始值,to表示序列的终止值,by表示步长(by 省略时,表示步长值为1)
> seq(1,10,2)
[1] 1 3 5 7 9
> seq(1,10)
[1] 1 2 3 4 5 6 7 8 9 10
有时关注的是数列的长度,利用句法:seq(下界,by=,length=)
> seq(1,by=2,length=10)
[1] 1 3 5 7 9 11 13 15 17 19
rep(x,times,……)x表示要重复的对象,times表示重复的次数
> rep(c(1,3),4)
[1] 1 3 1 3 1 3 1 3
> rep(c(1,3),each=4)
[1] 1 1 1 1 3 3 3 3
对每个元素进行重复;
R中的内置函数:
mean()来示向量的均值
median()求是位数
var()求方差
sd()求标准差
sort()对向量排序
rev()将向量按原方向的反方向排列
rank()给求出向量的秩
prod()求向量连乘积
append()为向量添加元素
对向量运算常见函数表
函数 用途
sum() 求和
max() 求最大值
min() 求最小值
range() 求极差(全矩)
mean() 求均值
median 求
中位数var() 求方差
sd() 求标准差
sort() 排序
rev() 反排序
rank() 求秩
append() 添加
replace() 替换
match() 匹配
pmatch() 部分匹配
all() 判断所有
any() 判断部分
prod() 积
2.3.2 矩阵
矩阵(matrix)是将数据用行和列排列的长方形表格,它是二维的数组,其单元必须是相同的数据类型,通常用列来表示不同的变量,用行表示各个对象。
其句法是:
matrix(data=NA,ncol=1,byrow-=FALSE,dimnames=NULL)
data是必须的,其它几个选择参数。
nrow表示矩阵的行数
ncol表示矩阵的列数
byrow默认为FALSE,表示矩阵按列排列,如设置为T,表示按行排列;
dimnames可更改矩阵行列名字
diag()函数生成
对角矩阵diag()这个函数比较特别,当数据是向量时则生成对角矩阵,但当数据是矩阵时,则返回对角元素
也可用函数diag()生成
单位矩阵 当我们生成了某个矩阵后,若要访问矩阵的某个元素或某行(列),可以利用形如A[i,j]的形式得到相应的索引矩阵
矩阵可进行相应的加减乘除运算,但运算过程中要注意行数和列数的限制条件
R里A*B并不是表示矩阵相乘,只表示矩阵对应的元素相乘
矩阵相乘应用A%*%B
dim()返回矩阵的行数和列数
nrow()返回矩阵的行数
ncol()返回矩阵的列数
solve()返回矩阵的
逆矩阵对矩阵运算的常见函数
函数 用途
as.matrix() 把非矩阵的转换成矩阵
is.matrix() 辨别是否矩阵
diag() 返回对角元素或生成对角矩阵
eigen() 求
特征值和特征向量solve() 求逆矩阵
chol() Choleski分解
svd() 奇异值分解
qr() QR分解
det() 求
行列式dim() 返回行列数
t() 矩阵转置
apply() 对矩阵应用函数
R语言还提供了专门针对矩阵的行或列计算的函数
如 colSUms()对矩阵各列求和 colMeans()求矩阵各列的均值
类似的有 rowSums()rowMeans()
更一般的方法:
apply()函数来对各行各列进行运算
句法是:apply(X,MARGIN,FUN,……)
X表示要处理的数据
MARGIN表示函数作用的范围
取1表示对行运用函数
取2表示对列运用函数
FUN表示要运用的函数
rbind()、cbind()将两个或两个以上的矩阵合并起来
rbind()表示按行合并,cbind()则表示按列合并
2.3.3 数组
数组(array)可以看作是带有多个下标的类型相同的元素的集合。
数组的生成函数是array(),其句法是
array(data=NA,dim=length(data),dimnames-NULL)
data表示数据,可以为空
dim 表示维数
dimnames可以更改数组难度的名称
2.3.4 列表
向量、矩阵和的单元必须是同一类型的数据,若一个数据对象需要含有不同的数据类型,可采用列表(list)这种数据对象的形式。
列表是一个对象的有序集合构成的对象,列表中包含的对象又称为它的分量(components),分量可以是不同的模式或(和)类型
语法式为:list (变量1=分量1,变量2=分量2,……)
若要访问列表的某一成分,可以用LST[[1]],LST[[2]]的形式访问
因分量可以被命名,故可以在列表名称后加$符号,再写上成分名称来访问列表分量
函数length()、mode()、names()可以分别返回列表的长度(分量的数目)、数据类型、列表里成分的名字
2.3.5 数据框
数据框(data frame)是一种矩阵形式的数据,但数据框中各列可以是不同类型的数据。数据框每列是一个变量,每行是一个观测 。
对可能列入数据框中的列表有如下的一些限制:
1.分量必须是向量(数值,字符,逻辑),因子,数值矩阵,列表或者其他数据框。
2.矩阵,列表和数据框为新的数据框提供了尽可能多的变量,因为它们各自拥有列、元素或者变量。
3.数值向量、逻辑值、因子保持原有格式,而字符向量会被强制转换成因子并且它的水平就是向量中出现的独立值。
4.在数据框中以变量形式出现的向量结构必须长度一致,
矩阵结构必须有一样的行数。
R中用函数data.frame()生成数据框,其句法是:data.frame(data1,data2,……)
数据框的列名默认为变量名,也可对列名进行重新命名
也可以对数据框的行名进行修改
2.3.6 因子和有序因子
分类型数据经常要把数据分成不同的水平或因子(factor)
生成因子的命令是factor(),其句法是:factor(data,levels,labels,……)
其中data表示数据
levels是因子水平向量
labels是因子的标签向量
levels,labels是备选项,可以不选
若上面的每个因子并不表示因子的大小,要表达因子之间有大小顺序(考虑因子之间的顺序),则可以用 ordered()函数产生
2.4 数据的录入及编辑
c函数:c函数是把各个值联成一个向量或列表,可以形成数值型向量、字符型向量或其它类型向量
scan函数:功能类似于c函数,实际上是一种键盘
输入数据函数。当输入scan(),然后按
回车键,这时将等待输入数据,数据之间只要空格分开即可(c函数要用逗号分开)。输入完数据,再按回车键,这时数据录入完毕。
scan函数还可以读入外部文本文件,若现有一个文本文件,data.txt,读入这个文件的命令是:> x=scan(file="dat.txt")
若原文件的数据之间有逗号等
分隔符,用scan读入应该去掉这些分隔符,其命令是:> x=scan(file="dat.txt",sep=",")
编辑数据
data.entry命令
xx原先未被定义,现在赋予其一个空值,这时会出现一个电子表格界面,等待输入数据:> data.entry(xx=c(NA))
当电子表格关闭后,数据会自动保存
edit命令用来编辑函数,也可用来编辑数据,但不会自动保存
fix函数与edit类似,但它可以自动保存
从外部文件读入数据
从文本文件读取:
> s1=read.table("student.txt")
> s1
V1 V2 V3
1 class sex score
2 1 女 80
3 1 男 85
4 2 男 92
5 2 女 76
6 3 女 61
7 3 女 95
8 3 男 83
读入表格数据的命令是:read.table
忽略掉标签而直接使用默认的行标签
> s2=read.table("student.txt",header=T)
> s2
class sex score
1 1 女 80
2 1 男 85
3 2 男 92
4 2 女 76
5 3 女 61
6 3 女 95
7 3 男 83
从网络读入数据
url可以从网页上读入正确格式的数据,要借助read.table函数
> address=
http://www.the-data-mine.com/bin/view/Misc/WebHome/sample.txt
> read.table(file=url(address))
读入其他格式的数据库
要读入其他格式的数据库,必须先安装"foreign"模块,它不属于R的8个内置模块,需在使用前安装。 library(foreign)
SAS:R只能诗篇SAS Transport format(XPORT)文件,需要把普通的SAS数据文件(.ssd和.sas7bdat)转换成Transport format(XPORT)文件,再用命令:read.xport()
SPSS数据库:read.spss()可读入SPSS数据文件
Epi info数据库:
要给数据集一个名字,则是;read.epiinfo("文件名.rec")->名称
Stata数据库:
R可读入Stata5,6,7的数据库
读入数据文件后,使用数据集名$变量名,即可使用各个变量
> read.dta(“文件名.dta”)
读入数据文件后,使用数据集名$变量名,即可使用各个变量。
>mean(data$age)
便是计算数据集 data中的变量age的均数。
2.5 函数、循环与条件表达式
2.5.1 编写函数
句法是:
函数名 = function (参数1,参数2…)
{
函数体
函数返回值
}
对于这类只有一个算术式的简单函数,也要不要{}
>mean(data$age)
便是计算数据集 data中的变量age的均数。
若不使用圆括号,直接输入函数名,按回车键将显示函数的定义式:
单参数:使函数个性化,可使用单参数,函数将会根据参数的不同,返回值不同
> welcome.sb = function(names) print(paste("welcome",names,"to
use R"))
> welcome.sb("Mr fang")
[1] "welcome Mr fang to use R"
> welcome.sb("Mr Wang")
[1] "welcome Mr Wang to use R"
默认参数:即不输入任何参数
函数的默认参数
> welcome.sb=function(names="Mr fang")print(paste("welcome",
names,"to use R"))
> welcome.sb()
[1] "welcome Mr fang to use R"
当函数体的表达式超过一个时,要用{}封起来
2.5.2 for循环
for循环的句法是:
for (变量 in取值向量) {
表达式…
}