在日常碰到问题时出现当前“数据类型不能进行操作”的提示时还是有些脑壳疼,所以这次整理了针对R数据类型转换的总结。理论部分主要是R for Data Science的向量节选翻译、《R语言实战》第二章2.2创建数据结构、《R in a Nutshell》以及猴子老师的向量ppt。
————文章结构——————
一、理论知识向量、矩阵、数据框等基本介绍
integer和double的区别
向量和因子区别
tibble和data frame区别
二、举个例子某一列文本转为数字
某一列数字转为文本
三、总结一下
——————————————
一、理论知识
1.向量、矩阵、数据框等基本介绍
有两种类型的向量:
(1)原子向量,其中有六种类型:logical,integer, double, character, complex和 raw,integer和double统称为numeric(数值)向量。
(2)列表,有时称为递归向量,因为列表可以包含其他列表。
原子向量和列表之间的主要区别在于原子向量是均匀的,而列表可以是异构的(即列表的数据结构可以不一致)。还有一个相关的对象:NULL。NULL通常用于表示缺少矢量(与NA用于表示矢量中缺少值的情况相反)。NULL通常表现为长度为0的矢量。下图为关系图。图片来源:http://r4ds.had.co.nz/vectors.html
可以说,向量是最基本存在,那么向量和矩阵、数组、数据框这些又是什么关系呢?
向量最基础。
数组:多维的向量(向量可以理解为一维数组,矩阵可以理解为二维数组)
#一维数组(向量)
a
a
#二维数组(矩阵)
b
b
#多维数组(还是数组)
c
c
结果:
这里补充以下,如果矩阵按列填充,需要加上byrow=T
b
而对于数据框,我的理解是,我们最常使用的excel表就是数据框模式,比如医院数据,病人编号、性别、血型,每一列都是相同的数据结构,结合成一个大表供我们分析。
2.integer和double区别
数值型向量包含两种类型:integer和double
我以前老纠结啥时候辨别这两类数值型向量呢?看图来操作:
查看数据类型最好用typeof,可以看出double比int要普遍一些,一般的c(1,2,3)都是double,但如果都加了L,变为integer了。这两类数值型向量不用太担心二者关系,一般R可以内部自动转换这两类数值然后计算。
也可以转换,转换代码为:
as.double()
as.integer()
3.向量和因子区别
另一个例子:
上图来源:书
再举个例子图片来源:http://www.cyclismo.org/tutorial/R/types.html
总结来说,就是属于类别的向量最好转化为因子。比如性别(男、女)、成绩评级(优秀、良好、及格、不及格),这也说明了为什么总会看到stringasfactor=False.我们一般不选择把向量先全部转为因子,面对分类型变量才考虑那么做。
4.tibble和data frame区别
这两个功能可以说完全一样,只是在看书过程中发现tibble慢慢比data frame更流行起来,详情可以见这篇文章tibble 1.0.0 | RStudio Blog,在导入dplyr包后,用tibble比用data frame更快捷简洁,tbl_df代替了table(好吧我想说,一般还是用data frame,在用到dplyr包时,改用tibble就行)
二、举个例子
1.某一类文本转为数字
有一组这样的数据,我想把性别一栏转为女为1,男为2,方便计算,如何做?
setwd("c:\\Users\\Administrator\\desktop")
data1
typeof(data1)
table(data1$children)
a
b
data1$gender
结果如下:
貌似可以,但查看结构类型,还是字符串形式,需要转为数值型才能进行后续计算。
data1$gender " />
不用担心了,已经完全转换好了。
2.某一类数字转为文本
还是这个例子,如果想把children一列转为yes(孩子数>0)和no(孩子数=0),如何做?
输入代码:
data1$children[data1$children > 0]
data1$children[data1$children == 0]
data1$children
levels=c(0,1),
labels=c("No","Yes"))
显示结果:
这里补充一句,函数factor()可为类别型变量创建值标签,代码中levels代表变量实际值,labels表示包含了理想值标签的字符型向量。
三、总结一下
本文为数据结构的温习,感觉向量是地基,地基里有土渣渣(有数值型【数值型又包括double和integer】,逻辑型【TRUE,FALSE,NA】,字符型等),整个房子是数组,地基+一楼是向量,二楼是矩阵,房子和附近居民区构成数据框。
文本转为数值型(用sub替换 --> as.numeric一下)
数值型转为文本(先转为factor形式,再创建标签)
嗯,完结撒花~~~