Excel是数据分析中最常用的工具,本篇文章通过R与excel的功能对比介绍如何使用R通过函数式编程完成excel中的数据处理及分析工作。我们总结出最常用的50个函数,通过这些函数介绍如何通过R完成数据生成和导入,数据清洗,预处理,以及最常见的数据筛选,回归预测和假设检验等最常见的操作 。
本系列文章共分为三篇10个部分。已由人民邮电出版社出版,感兴趣的朋友可以在异步社区获取完整版
这是第二篇,介绍4-7部分的内容,数据预处理,数据提取,数据筛选和数据汇总。
4,数据预处理
第四部分是数据的预处理,对清洗完的数据进行整理以便后期的统计和分析工作。主要包括数据表的合并,排序,数值分列等工作。
4.1. 数据合并
首先是对不同的数据表进行合并。数据表的合并有三种,横向合并,纵向合并和增加新字段。我们这里创建一个新的数据表df1,并将df和df1两个数据表进行纵向合并。
df1<-data.frame(id=c(1007,1008,1009,1010), city=c("Beijing","shenZhen","guangzhou","shenzhen"), age=c(25,34,24,37), category=c("100-D","100-A","110-C","110-A"), price=c(1600,2633,2433,4442))
纵向合并的意思就是在数据表的后面追加新的行记录,R中使用rbind函数来完成这个工作。下面是具体的代码,将df和df1两个数据表进行纵向合并。
</pre> #合并数据表 df<-rbind(df,df1) <pre>
第二种数据表合并的方法是在现有的数据表中增加新的字段。增加新字段的方法有两种,将现有的字段进行合并,通过现有字段进行计算后生产新字段 。
下面的代码中我们使用paste函数将id和city字段进行合并,生产新的id_city字段,并合并在df数据表中。
</pre> #合并两个字段的内容 id_city<-paste(df$id,df$city) df=cbind(df,id_city) <pre>
另一种方法是对数据表中的字段进行计算,生产新的字段。下面的代码中对price进行计算生产每条记录在price中的比率字段,并合并在原有数据表中 。
</pre> #计算新字段并合并 rate=round(df$price/sum(df$price),digits = 2) [1] 0.04 0.11 0.07 0.17 0.11 0.14 0.05 0.08 0.08 0.14 df=cbind(df,rate) <pre>
4.2. 数据排序
Excel中可以通过数据目录下的排序按钮直接对数据表进行排序,比较简单。R中需要使用order函数完成排序。
首先,我们按id对数据表进行排序。Decreasing参数为TRUE表示逆序。
</pre> #对数据表按id列进行排序(逆序) df[order(df$id,decreasing = TRUE),] <pre>
省略decreasing参数默认为正序排序。下面的代码按rate对数据表进行排序。
</pre> #对数据表按rate列进行排序(正序) df[order(df$rate),] <pre>
也可以同时多数据表中的多列进行排序,下面是具体的代码和排序后的结果。
</pre> #对多列进行排序 df[order(df$age,df$price,df$age,decreasing = TRUE),] <pre>
4.3. 数据分列
Excel中的数据目录下提供“分列”功能。在R中使用strsplit函数实现分列。对于分列的操作R比Excel要复杂,下面是具体的代码,包括提取数据,转换格式和数据表合并等操作。
在数据表中category列中的数据包含有两个信息,前面的数字为类别color,后面的字母为size值。中间以连字符进行连接。我们使用strsplit函数对这个字段进行拆分,并将拆分后的数据表匹配回原数据表中。下面是具体的代码和结果。
</pre> #数据分列 df_category<-df$category typeof(df_category) [1] "integer" df_category=as.character(df_category) typeof(df_category) [1] "character" df_c<-strsplit(df_category,'-') color<- sapply(df_c, "[", 1) size<- sapply(df_c, "[", 2) category1=data.frame(color,size) df=cbind(df,category1) <pre>
4.4. 数据表匹配
数据匹配是我们在经常使用的操作之一,我们这里创建一个新的数据表df2,并将df和df1两个数据表进行合并。在Excel中可以通过VLOOKUP函数实现。
在R中可以通过merge函数一次性实现。下面建立df2数据表,用于和df数据表进行合并。
</pre> df2<-data.frame(id=c(1001,1002,1003,1004,1005,1006,1007,1008), gender=c('male','female','male','female','male','female','male','female'), pay=c('Y','N','Y','Y','N','Y','N','Y'), m_point=c(10,22,22,54,20,43,18,27)) <pre>
使用merge函数对两个数据表进行合并,合并的方式为inner,将两个数据表中共有的数据匹配到一起生成新的数据表。
</pre> #数据表合并 inner模式 df<-merge(df,df2,by='id') <pre>
除了inner方式以外,合并的方式还有left,right和outer方式。这几种方式的差别在我其他的文章中有详细的说明和对比。
</pre> #数据表合并 outer模式 merge(df,df2,by='id',all=TRUE) #数据表合并 left模式 merge(df,df2,all.x=TRUE,by='id') #数据表合并 right模式 merge(df,df2,all.y=TRUE,by='id') <pre>
4.5. 设置索引列
完成数据表的合并后,我们对df数据表设置索引列,索引列的功能很多,可以进行数据提取,汇总,也可以进行数据筛选等。设置索引的函数为rownames。
</pre> #设置索引列 rownames(df)=df$id <pre>
4.6. 数据分组
最好我们对数据表按价格区间进行分组,使用ifelse函数对数据进行判断并标记。价格大于等于4000元的标记为high,小于4000元的标记为low,并将结果记录在group列中。
</pre> #按price对数据进行分组 df$group<-ifelse(df$price>=4000,"high","low") <pre>
5,数据提取
第五部分是数据提取,也是数据分析中最常见的一个工作。这部分主要使用三个数据提取的方法,按位置提取,按索引提取和按条件提取。下面介绍每一种函数的使用方法。
5.1. 按位置提取数据
</pre> #提取数据表第二行 df[2,] <pre>
</pre> #提取数据表第二行至第三行 df[2:3,] <pre>
</pre> #提取数据表第二列 df[2] <pre>
</pre> #提取数据表第二列至第三列 df[,2:3] <pre>
</pre> #提取数据表第二行第二列 df[2,2] <pre>
</pre> #提取数据表特定区域数据 df[2:3,2:3] <pre>
5.2. 按索引提取数据
</pre> #按索引提取行数据 df['1001',] <pre>
</pre> #按索引提取多行数据 df <pre>
</pre> #按列名称提取 df['city'] <pre>
</pre> #按索引提取行与列数据 df['1003','city'] <pre>
</pre> #按索引提取多个行与列数据 df <pre>
5.3. 按条件提取数据
</pre> #查找年龄最大的记录所在行信息 df[which.max(df$age),] <pre>
</pre> #查看金额最小的记录所在行信息 df[which.min(df$price),] <pre>

6,数据筛选
第六部分为数据筛选,使用与,或,非三个条件配合大于,小于和等于对数据进行筛选,并进行计数和求和。与excel中的筛选功能和countifs和sumifs功能相似。
6.1. 按条件筛选(与,或,非)
Excel数据目录下提供了“筛选”功能,用于对数据表按不同的条件进行筛选。R中使用subset函数配合筛选条件来完成筛选功能。配合sum和count函数还能实现excel中sumif和countif函数的功能。
首先简单筛选数据表中城市为”shanghai”的数据。
</pre> #数据筛选 subset(df,df$city=="shanghai") <pre>
使用“非”条件筛选数据表中城市不是“shanghai”的数据。
</pre> #按非条件进行筛选 subset(df,df$city!="shanghai") <pre>
使用“与”条件筛选数据表中城市为“shanghai”,并且年龄大于30岁的数据。
</pre> #按与的条件筛选 subset(df,df$city=="shanghai" & df$age>30) <pre>
使用“或”条件筛选数据表中城市为“shanghai”,或年龄小于30岁的数据。
</pre> #按或的条件筛选 subset(df,df$city=="shanghai" | df$age<30)\ <pre>

6.2. 筛选后对数据进行计算
在前面的代码后增加price字段和sum函数。对筛选后的price字段进行求和,相当于excel中的sumifs函数的功能。
</pre> #Excel中的sumifs求和 sum(subset(df,df$city=="shanghai" | df$age<30)$price) [1] 9852 <pre>
</pre> #Excel中的countifs计数 length(subset(df,df$city=="shanghai" | df$age<30)$id) [1] 4 <pre>
</pre> #Excel中的averageifs计数 mean(subset(df,df$city=="shanghai" | df$age<30)$price) <pre>
7,数据汇总
第七部分是对数据进行分类汇总,Excel中使用分类汇总和数据透视可以按特定维度对数据进行汇总,R中进行汇总的方法有多种,本文主要介绍的函数是table和tapply。下面分别介绍这两个函数的使用方法。
7.1. 分类汇总
Excel的数据目录下提供了“分类汇总”功能,可以按指定的字段和汇总方式对数据表进行汇总。R中通过table和tapply函数完成相应的操作。
</pre> #使用table进行汇总计数 table(df$size) <pre>
</pre> #使用table对两个字段进行汇总计数 table(df$color,df$size) <pre>
</pre> #按city对price求和汇总 tapply(df$price,df$city,sum) <pre>
</pre> #按city对id计数汇总 tapply(df$id,df$city,length) <pre>
下一篇文章,也就是本系列的最后一篇我们将介绍8-10最后三部分的内容,分别为数据统计,相关分析,回归预测及假设检验,数据导出。请朋友们继续关注。
—【所有文章及图片版权归 蓝鲸(王彦平)所有。欢迎转载,但请注明转自“蓝鲸网站分析博客”。】—
老师您好!我在4.3数据分列部分的10行和11行报错,反复检查了好几遍,和您上面的一样,您能抽空解答下吗?谢谢您
报的什么错误呢?