【R语言学习】003 变量类型,检查更改
第一部分目标:001~011,R的基础操作(基本不涉及数据分析数据流)
第二部分目标:012~020,一点基础的数据分析操作,如数据清理
第三部分目标:020之后,开始学习一些进阶内容
003 变量类型,检查更改
本章目标:
☆知道数据的类型、基本属性等(这个真的了解就好,后面都会单独细讲。这一节虽然是简介但字数最多)
☆☆转换变量类型
☆☆☆学会检查变量并且查找有用的信息
☆学会操作用户工作区
一、类
引语
如
> x<-c(TRUE,FALSE)
> class(x)
[1] "logical"
1、数据类型
(1)若输入的数据为一个数字,则数据类型为数值型(numeric),若想数据类型为整数(integer),则需要在所赋值后加“L”。如
> x <- 5
> class(x)
[1] "numeric"
> y <- 5L
> class(y)
[1] "integer"
(2)复数(包括虚部和实部,且虚部不为0)的数据类型为复数型,如2+i;
线性代数里面有:向量、矩阵、行列式等
R语言中的数据结构有7种:标量,向量,矩阵,数组(array),数据框(data frame),因子(factor),列表(list)。(数据框和列表允许多种数据类型)。
枯了,这个玩意上面被挡住的地方写的是“单元素的向量被称为标量”
这些东西之后都会学到,这里只是简单了解。过多介绍毫无益处反而更乱。上学期学C++的时候就是这样,第二章直接学懵。
所有对象的数据都有两个属性①class②length(长度)
想要查询对象的这两个属性,用class() 、 length()可以得到
举个例子:
x<-numeric(2)
定义了一个长度为2的数值型数据
用线性代数语言:x是一个二维行向量
> d <- array(1:12, c(3,2,2))
> dim(d)
[1] 3 2 2
二、检查和更改“类”
1、检查
用is函数可以检查
eg:
> is.character("cwt")
[1] TRUE
使用is函数是为了测试这个对象的类型,我们希望它能返回一个逻辑值TRUE,如果返回的是FALSE,我们就需要对其进行调整。而class函数的使用,是在我们不知道但想知道对象类型的时候。这两者最初目的不同。
在实际操作中,通常采用以下措施来纠正数据类型
if(!is(x,"..."))#...表示数据类型
{
#这里加入纠正措施
}
2、更改
所谓更改,指的就是转型(casting),大部分的is函数都有与之对应的as函数。一般情况下用特定的as函数而非单纯的as函数。(具体见下)
> x<-"123"
> as(x,"numeric")
[1] 123
> #上面是把x从一个字符串变量转型为一个数值型变量
> #像这样的as函数就是所谓“单纯的”as函数
>
> as.numeric(x)
[1] 123
> #这就是所谓“特定的”as函数
记不太清楚老师上课有没有讲过直接给对象分配一个新的“类”以达到改变其类型的效果
eg:
> x<-"123456"
> class(x)<-"numeric"
> x
[1] 123456
> #这里就是给x分配了一个数值类,达到把原先的字符型转变为数值型的效果
做个检查:
> is.numeric(x)
[1] TRUE
三、检视变量
(为避免误会,将参考书此处的检查变量换为检视变量)
这里介绍一个很有用的summary函数
它能为不同的数据类型提供汇总信息
这里用runif生成一些随机数来做个测试
> num<-runif(20)
> #runif函数用来生成0到1之间的随机数,
> #20表示生成20个这样的数
> summary(num)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.02688 0.20550 0.41648 0.42714 0.69348 0.82970
> #Qu表示分位数
在《学习R》《R语言实战》中,介绍到这,接下来会用一些因子型、数据框做演示,显然这些玩意如果没有注解初学者基本看不懂(虽然学到后面就知道这里的例子不难)。本系列将到007左右开始细讲因子型。
这里主要是先记住summary这个函数
其他例子:
首先我们先给几个变量赋值,
> num<-runif(30)
> fac<-factor(sample(letters[1:5],30,replace=TRUE))
> bool<-sample(c(TRUE,FALSE,NA),30,replace = TRUE)
> drf<-data.frame(num,fac,bool)
注释:sample表示随机抽样;30,replace=TRUE表示抽30次,letters[1:5]表示前五个字母abcde。factor表示这里是个因子型向量。多维对象都是通过列来汇总的。
接下来再介绍几个其他函数
head、str、unclass、attributes、View
head函数可以显示多维对象的前6行(如数据框)(关于数据框会在004或者005介绍)
数据框的summary函数像是对每一列单独调用summary
str函数能显示对象的结构(多用于数据框)
unclass显示变量是如何构建的。在下面的例子里面,levels是因子型向量的一个属性(因子型在007会讲)。对它使用unclass会显示它仅仅是个拥有levels的整数向量
attributes函数能显示当前所有对象的属性列表
View(V是大写)能把变量生成一个表格
在Rstudio中的效果见下
以上函数例子详见下面的代码
> summary(num)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.03859 0.23581 0.45436 0.50639 0.76401 0.96125
> summary(fac)
a b c d e
8 4 8 6 4
> summary(bool)
Mode FALSE TRUE NA's
logical 12 15 3
> summary(drf)
num fac bool
Min. :0.03859 a:8 Mode :logical
1st Qu.:0.23581 b:4 FALSE:12
Median :0.45436 c:8 TRUE :15
Mean :0.50639 d:6 NA's :3
3rd Qu.:0.76401 e:4
Max. :0.96125
> head(drf)
num fac bool
1 0.7073118 a FALSE
2 0.1830570 a TRUE
3 0.2198313 a NA
4 0.6306432 e TRUE
5 0.2837335 c TRUE
6 0.7173090 c TRUE
#head可以仅仅显示多维对象额前几行
> str(num)
num [1:30] 0.707 0.183 0.22 0.631 0.284 ...
> str(drf)
'data.frame': 30 obs. of 3 variables:
$ num : num 0.707 0.183 0.22 0.631 0.284 ...
$ fac : Factor w/ 5 levels "a","b","c","d",..: 1 1 1 5 3 3 4 2 4 1 ...
$ bool: logi FALSE TRUE NA TRUE TRUE TRUE ...
> unclass(fac)
[1] 1 1 1 5 3 3 4 2 4 1 2 1 4 1 2 3 1 5 3 4 5 3 5 3 4 4 3
[28] 3 1 2
attr(,"levels")
[1] "a" "b" "c" "d" "e"
> attributes(fac)
$levels
[1] "a" "b" "c" "d" "e"
$class
[1] "factor"
> View(drf)
>
可以用View(head(drf,50)),查看刚刚定义的数据框变量drf的前50行
四、工作区
用ls函数可以列出现有变量的名称,rm函数用来清除变量和清理区间。
ls能连着名字把结构一起列出。用ls(pattern="...")能找到想要的包含特定字符的变量名
这个了解就好,也挺好记的。
在Rstudio中,如果工作量不是很大,这个功能个人感觉有点鸡肋
用《学习R》课后习题3-3举例子(书上没有附参考答案):
题目:创建一些以蔬菜(英文)命名的变量,列出用户工作区中所有包含字母a的变量
答案如下:
第一步,百度搜索蔬菜英文词汇大全,香瓜honeypeach ,卷心菜cabbage,胡萝卜carrot,
木耳 agarics 豌豆 pea 马铃薯(土豆) potato 洋葱onion
差不多了,
第二步,
> honeypeach<-1
> cabbage<-2
> pea<-3
> onion<-TRUE
> agarics<-5
> potato<-"brown"
> carrot<-"red"
> ls()
[1] "agarics" "cabbage" "carrot" "honeypeach"
[5] "my_fac" "my_fac2" "my_fac3" "myfac6"
[9] "onion" "pea" "potato" "tempstring"
#这里我发现上一张工作区命名的变量my_fac留在上面
#用rm清除掉
#重新来一次
> rm(list=ls(pattern = "my"))
> honeypeach<-1
> cabbage<-2
> pea<-3
> onion<-TRUE
> agarics<-5
> potato<-"brown"
> carrot<-"red"
> ls()
[1] "agarics" "cabbage" "carrot" "honeypeach"
[5] "onion" "pea" "potato" "tempstring"
#nice!
003就到这里结束,到目前为止,都还没什么难度。当年我们学C++不也是如此吗?(从“这东西挺简单”到“背,多分”)
***上一期推文我里面附了几个R document的链接,但后来发现这个是无法直接用浏览器打开的(电脑和手机端都不行)。必须要在R自身的编辑器里面输入?加上要询问的内容,才能跳转至浏览器。而在Rstudio中,不会跳转至浏览器,编辑器右下角Help标签栏会自动显示要查询的内容(如下图)(不能像浏览器那样使用翻译功能)。因为一些地方英文看不懂,根据个人感受,还是选择在R自身的编辑器中输入查询指令,在浏览器上阅读,这样一些看不懂的地方也有翻译。非常抱歉,因本人上一次的疏忽而造成各位不良阅读体验。
为了写这个专栏,我放弃了王者荣耀
可喜可贺,可喜可贺
之所以和老师进度不同,是因为本人二月份已经开始自学这个,看了三四个版本的初级教程,根据自己的感受选择比较容易懂的框架。老师在课堂上讲课毕竟要顾及进度,难免会有一些地方讲不明白或者虽然讲明白了但还没等我们明白就开始讲下面的东西
bilibili等网站上有些人出这类教学视频仿佛是在炫耀自己技术多么高超而非为了教会学习者
先在此立个flag,该系列推文一定会更新到020(之后估计要准备期末)
小说。。。照常佛系更新,想到什么就写什么吧。
明天更新向量、矩阵、数组
往期推荐
欢迎关注淏泧三千
这是个向学习区进军的