“ No one konws everything, and you don't have to.” --科白君本期为大家推荐在数据分析过程中常用的包dplyr。通过该包中几个函数的单独和/或联合使用能够轻松解决大多数据分析问题。这些函数包括数据排序(arrange),挑选变量(select),筛选变量(filter),添加列/变量(mutate)以及汇总(summarize)。 像excel一样, R语言也能够对数据分析进行排序。对数据的排序很重要,它不仅能够让我们大概地了解目标变量的数据结构,在画图的过程中排序与某些函数的联用还能够让我们按照期望的方式出图。上代码: rm(list=ls()) library(tidyverse) #该报包含了几个常用的R包,包括但不限于dplyr #调用内部数据 data("mtcars") #“%>%”读作然后,是一种管道的方式进行数据运算;它的好处用时自见 str(mtcars) dt<-mtcars %>% as_tibble(rownames="names")#data.frame change to tibble #why? mtcars dt  这是原始的data.frame(数据框)数据,可以看到当我们预览数据时会出现一大堆的数据。但是,有时候我们并不关心所有的数据,我们仅仅只为验证数据结构是否符合我们的预期。在此时,显然tibble数据更能满足我们的要求。如下:
当我们想要对数据排序时,我们可能有以下几个要求: 1)对A变量从小到大升序;
dt %>% arrange(cyl) #1)对cyl从小到大升序 
2)对A变量从大到小降序; dt %>% arrange(desc(cyl)) #2)对cyl从大到小降序 
3)在对A变量从小到大降序后,对B,C变量从小到大降序。
dt %>% arrange(desc(cyl,mpg,vs)) #3)先对cyl降序,接着对mpg降序,再对vs降序  有时候我们并不需要对所有的变量进行数据分析,我们可能只关心数据中的一两个变量,这样我们只需要把这些关心的变量从原来的数据中拿出来即可。#select variable dt %>% select(mpg,cyl,gear) #the other way to select target variable dt[,c(1,2,11] 但是,当我们的变量比较多时,采用第二种方法挑选目标变量就比较麻烦了。

除了挑选变量,有时候我们用的更多的可能是根据一些条件对数据进行筛选,如去除空值"NA"的行,或者选出符合特定条件的行。
1)选出所有vs变量中大于0的值 dt %>% filter(vs>0) #选出除所有vs大于0的值 
2)选出所有vs变量中大于0“且”am变量中也大于0的值
dt %>% filter(vs>0,am>0) #选出所有vs大于0,“且”am>0的值 
3)选出所有变量中vs“非”0的值 
4)更多运算符的含义“,”表示“且”,表示同时满足多个条件;“&”表示“与”;“|”表示“或”;“=>”表示大于等于;“<=”表示小于等于
有时候,我们对某个变量进行运算后,希望该变量合并到原始的数据中,这就需要一个重要的函数mutate了。
如,我想计算mpg与cyl的比值,并把它们的比值添加到数据的第一列: dt %>% mutate(mpg_cyl = mpg/cyl) %>% select(mpg_cyl,everything()) 
其实我想把它俩的比值(mpg_cyl)添加到第二列: dt %>% mutate(mpg_cyl = mpg/cyl) %>% select(names,mpg_cyl,everything()) 
dt %>% mutate(group = ifelse(vs=="0","small","big")) %>% #添加分组 select(names,group,everything()) %>% group_by(group) %>% summarize(mpg_mean = mean(mpg,na.rm = TRUE)) #可以考虑一下na.rm的含义是什么? 
2)我想对数据中选出的几个变量进行运算,如求和,求平均值等
dt %>% mutate(group = ifelse(cyl < 6,"small", ifelse(cyl > 6,"big", "median"))) %>% select(group,mpg,cyl,disp) %>% reshape2::melt(id="group") %>% group_by(group,variable) %>% summarize(value_sum = sum(value,na.rm = TRUE)) %>% reshape2::dcast(group ~ variable, value.var = "value_sum") 
这串代码的意思如下:1)首先我想根据cyl变量的大小把所有的数据分为三个组,分别是小于6的为small组,大于6的为big组,中间的为median组;2)然后因为我想对mpg,cyl和disp这三个变量求和,所以我单独的选出了这三列,因为如果分别对这三个变量求和的话,需要在求和时写三串代码(当然其实也可以,但是如果是100个甚至1w个变量呢?),所以我把宽数据转变为了长数据,这样就变1个分组为2个分组了(分别是group和variable);3)然后我根据这两个分组对目标的3个变量求和,并去除空值(na.rm=TRUE); 4)最后我还是想以宽数据的形式展示,所以我又把长数据转换为了宽数据(具体画图时可以根据自己的需要选择是否转变回来)。
除此之外,summarize还有其它运算,如求方差,中位数,等等。可以使用如下代码查看:
|