用R为数据分析插上翅膀
数据排序
像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
当我们想要对数据排序时,我们可能有以下几个要求:
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的值
dt %>%
filter(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还有其它运算,如求方差,中位数,等等。可以使用如下代码查看:
?dplyr::summarize