来源:丁点帮你
作者:丁点helper
在处理完缺失值之后,我们手里的数据可能还存在一些问题。接触过原始数据的小伙伴应该都很清楚,有些数据虽然是完整的,但格式却是乱糟糟的。
今天要关注的是其中Animal这个变量。
#导入数据survey<-read.csv("//Users//Desktop//titanic.csv",header=TRUE)#查看Animal这个变量survey$Animal#查看Animal这个变量包含几类levels(survey$Animal)
共有238条记录,用levels() 这个语句发现大家喜欢的动物共有155类,下面展示部分结果:忘记levels()语句用法的戳此回顾
[3] "A badger. They are very aggressive and small."[20] "A rich person's dog" [29] "Ant" [99] "lion" [153] "Wolf"[154] "wolf in switzerland "
这个变量是"你最喜欢的动物是什么?" 同学们的答案精彩到突破我的脑洞。
有的加了不定冠词,有的没加,有的说明了理由,有的还加了形形色色的描述性语言,大小写不一致……
而我们只想知道同学喜欢的动物是什么,不需要有任何限定语,也不需要知道这动物是有钱人的还是穷人家养的……喜欢狼那位小可爱,不需要告诉我是瑞士的狼啊
其实我觉得大家这样活泼又认真回答真的很好。但是从统计的角度来看,这样会给统计分析工作造成很多麻烦//www.58yuanyou.com。
因为瑞士的狼和蒲松龄写的那两只狼都是一个物种,但按照目前的数据,统计软件就会把它识别为两种动物啦。
数据清理第二步:统一格式
多重线性回归,一般是指有多个自变量X,只有一个因变量Y。前面我们主要是以简单线性回归为例在介绍,两者的差距主要在于自变量X的数量,在只有一个X时,就称简单线性回归。
第一步是处理缺失,戳此回顾
建议先把要处理的Animal 这个变量单独拿出来处理,这样可以保护原始数据库不被影响。
# 创建一个新的对象animal来存储animal <- survey$Animal
1. 统一大小写
用tolower() 语句将字符型变量转变为小写字母。
animwww.58yuanyou.comal <- tolower(animal)
现在看看animal这个变量中共有几类动物:
length(unique(animal))[1] 129
前面讲过,看到复杂的语句应该从中间往外读。unique(animal) 的作用是去重,获取animal这个变量中共有几类动物。length() 的作用是获取变量长度。
结果显示,在统一大小写之后,动物种类减少到了129类。
2. 去掉开头的不定冠词a, an
用gsub() 语句将不定冠词a或者an替换为『什么都没有』。
animal <- gsub("^a ","",animal)
- 第一个命令"^a " 是指希望被替换的内容(引号中的内容),^a 表示出现在字符最开头的a,这样可以避免『canada goose』这个词被替换为『canadgoose』。注意a后面还有一个空格,出现在最开头的a及其后面的空格都将被替换掉;
- 第二个命令"" 指替换成什么内容(引号中的内容),这里引号中什么内容都没有。注意,连空格都没有。言外之意就是把希望被替换掉的内容删掉;
- 第三个命令 animal 指被替换内容所在的对象。
同样地,我们把不定冠词an 也删掉:
animal <- gsub("^an ","",animal)
此外,还有一些答案中出现了奇怪的符号,把这些符号也删掉:
animal <- gsub("[^0-9A-Za-z///' ]","'" , animal) # 方括号指查找某个特定的字符animal <- gsub("'","" , animal)
此时动物种类减少到了108种:
length(unique(animal))[1] 108
3. 去掉结尾没必要的后缀
有的单词末尾有空格,这其实是没有必要的,需去掉。
- 用$这个符号来表示『字符串末尾』;
- 用\\s$这个符号表示字符串末尾的空格。单独的斜线\表示跳过字符,\s这个符号表示空格,那么\\s$就是『跳过字符+出现空格+字符串结束』。
animal <- gsub("\\s$","",animal)length(unique(animal)) [1] 108
此时动物种类仍有108种。
在编程语言中会用到像^,\,\s,$等符号来描述我们想要搜索的内容,这些符号叫做regular expression。
更多符号参见
https://rstudio.com/wp-content/uploads/2016/09/RegExCheatsheet.pdf
4. 去掉修饰性词语
先举个例子:有些同学喜欢狼这个动物,但加了一些修饰语,我们用下面的语句把wolf这个单词前后的字符全部去掉。
animal <- gsub(".*wolf.*","wolf",animal)
试着打开上面链接,查查英文句号. 和星号* 是代表什么?半分钟就可查到。
英文句号代表任何字符(除换行符号外)
星号代表任意次数
所以上面语句的意思就很明了了。不过我们收集到的数据中除了狼,还有很多其他动物。我们需要把每种动物都进行一次这样的操作。
这显然太费劲了,所以接下来用循环语句实现对不同对象的相同操作。
# 首先将数据中所有使用了修饰语句的动物找出来,并存储在一个对象中anvec <- c("wolf","cat","dog","badger","dolphin","bear","whale","owl","tiger","shark","fox","cow","panda","falcon","leopard","hamster","lizard", "goose")# 再用循环语句将上述动物前后的字符都去掉for (i in 1:length(anvec)){ animal <- gsub(paste(".*",anvec[i],".*",sep="原由网"),anvec[i],animal)}
- 循环语句中,f//www.58yuanyou.comor后面的()中是循环对象。在本例中,就是anvec这个字符串中的每一个元素。{}中的内容是对每个元素将要执行的操作。
- paste()的作用是将多个字符连接为一个整体,前面几个命令是将要连接的字符,sep=是指前面的字符用什么符号连接,本例中双引号中什么都没有,意思就是无缝衔接。
此时,数据中的动物种类减少到了84种:
length(unique(animal))[1]84
5. 修改一些非共性的问题
# 有同学最喜欢的动物是老师,好像也没啥毛病,这里去掉修饰语animal <- gsub(".*professor.*","",animal)# 金毛猎犬和小狗都属于狗;竖线表示『或者』animal <- gsub("gwww.58yuanyou.comolden retriever|puppy","dog",animal)# kitten和cat都是猫animal <- gsub("kitten","cat",animal)# 之前没有批量处理eagle的修饰语,因为会误将eagle ray这种动物删掉animal <- gsub("bald ","",animal)
eagle ray译为鲼(fen 四声)科动物,大概就是下图这类样子。
eagle ray
# 动物种类减少到79种length(unique(animal)) [1]79
小结
多重线性回归,一般是指有多个自变量X,只有一个因变量Y。前面我们主要是以简单线性回归为例在介绍,两者的差距主要在于自变量X的数量,在只有一个X时,就称简单线性回归。
此时再看看animal这个变量,已经处理干净了:
sort(unique(animal))
这篇文章比较长,且内容琐碎,能看到这里的小伙伴有心了。
清理混乱格式的数据可以说是科研中最耗时耗力的工作之一了,需要大家十分耐心和细心。希望今天讲的5个处理混乱格式的方法能对大家有帮助。