像Excel一样使用R进行数据分析(2)

Excel是数据分析中最常用的工具,本篇文章通过R与excel的功能对比介绍如何使用R通过函数式编程完成excel中的数据处理及分析工作。我们总结出最常用的50个函数,通过这些函数介绍如何通过R完成数据生成和导入,数据清洗,预处理,以及最常见的数据筛选,回归预测和假设检验等最常见的操作 。

R-for-Excel-Users-03

本系列文章共分为三篇10个部分。已由人民邮电出版社出版,感兴趣的朋友可以在异步社区获取完整版

excel_r

这是第二篇,介绍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))

df1
纵向合并的意思就是在数据表的后面追加新的行记录,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)
&#91;1&#93; "integer"
df_category=as.character(df_category)
typeof(df_category)
&#91;1&#93; "character"
df_c<-strsplit(df_category,'-')
color<- sapply(df_c, "&#91;", 1)
size<- sapply(df_c, "&#91;", 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>

df2
使用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)
&#91;1&#93; 9852
<pre>
</pre>
#Excel中的countifs计数
length(subset(df,df$city=="shanghai" | df$age<30)$id)
&#91;1&#93; 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函数完成相应的操作。

分类汇总1

 

</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>

按城市对id计数
下一篇文章,也就是本系列的最后一篇我们将介绍8-10最后三部分的内容,分别为数据统计,相关分析,回归预测及假设检验,数据导出。请朋友们继续关注。

—【所有文章及图片版权归 蓝鲸(王彦平)所有。欢迎转载,但请注明转自“蓝鲸网站分析博客”。】—

Comments

  1. cindy says:

    老师您好!我在4.3数据分列部分的10行和11行报错,反复检查了好几遍,和您上面的一样,您能抽空解答下吗?谢谢您

Speak Your Mind

*