R数据科学-1(dplyr)

R数据科学(dplyr)

如今数据分析如火如荼,RPython大行其道。你还在用Excel整理数据么,你还在用spss整理数据么。

数据分析的基础:Data Clean
数据清洗是数据处理的必备工作,而且往往需要花费大量时间去整理,去提取想要的数据,因为画图,报表都需要特定格式的数据。

EXCEL缺点:

  • 数据粘贴复制,导致存在很多副本,更改都不知道原来数据有没有被改动
  • 数据排序,计算,鼠标点击,容易误操作。
  • 忘记保存,白费时间
  • 效率低,时间长

现在,我们将学习对处理数据有用的两个软件包:

  1. dplyr是用于简化表格数据操作的软件包。
  2. tidyr使您可以在不同的数据格式之间快速转换。

两个软件包中的命令都可以与管道函数(%>%)很好地配合使用,这可以使代码更具可读性。详细内容可参考Cheatsheet手册

image.png

image.png

1.数据框格式(DataFrame

一般,我们的excel包括行(col)与列(row),在R语言中,经常对excel操作的对象称之为Dataframe,那么在进行数据查看时候,R语言可以看到数据结构。但是往往会打印出来很长,tidyr中的tibble就解决了此问题,直接简单的看到数据结构及变量类型。
class(mtcars)可以查看数据的类型,为"data.frame";mtcars就可以看到全部的数据了。但是如果数据太多,那么就很不方便。
head(mtcars),可以看到数据的前面6行,属于数据的一个预览。但是看不到各个列的属性。
%>%管道函数,其实就是将f()写在了数据的后面,下面示例的两个操作,都得到df,效果一样。只不过 %>%看起来更简单,将mtcars赋予新的tibble
df以后的输出,很简洁,能看到32*11的数据行与列,也能看到各列的属性。一目了然

#### Install packages --------------
install.packages(c("tidyverse"), dependencies = TRUE)
library(dplyr)
library(tidyr)

> class(mtcars)
[1] "data.frame"
> mtcars
> head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
> 
> df= mtcars %>% tibble()
> df
# A tibble: 32 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# … with 22 more rows
> df=tibble(mtcars)
> df

2.数据-变量提取及产生

我们经常会用到,只需要里面的几个变量,不是所有的变量都输出。那么就涉及到变量的提取。就会用到select函数,可以提取需要的变量。有一个好处就是,不修改原是数据。
那如果新产生一个变量mpg1=mpg,或者new=mpg*cyl,就用到mutate函数,产生新变量。

# select
mtcars %>% as.tbl() %>% 
  dplyr::select(mpg,cyl,am,gear)

# mutate
mtcars %>% as.tbl() %>% 
  dplyr::select(mpg,cyl,am,gear) %>% 
  mutate(mpg1=mpg,
         new=mpg*cyl)
         
         # A tibble: 32 x 6
     mpg   cyl    am  gear  mpg1   new
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6     1     4  21   126  
 2  21       6     1     4  21   126  
 3  22.8     4     1     4  22.8  91.2
 4  21.4     6     0     3  21.4 128. 
 5  18.7     8     0     3  18.7 150. 
 6  18.1     6     0     3  18.1 109. 
 7  14.3     8     0     3  14.3 114. 
 8  24.4     4     0     4  24.4  97.6
 9  22.8     4     0     4  22.8  91.2
10  19.2     6     0     4  19.2 115. 
# … with 22 more rows

3.数据-变量条件筛选

dplyr::filter()函数对上述新产生的变量的数据df,进行筛选。只要符合am=1给提取出来,或者对符合am=1,gear=4条件的输出。

# filter
df = mtcars %>% as.tbl() %>% 
  dplyr::select(mpg,cyl,am,gear) %>% 
  mutate(mpg1=mpg,
         new=mpg*cyl)

df %>% dplyr::filter(am==1)
df %>% dplyr::filter(am==1 & gear==4)

5.数据分组计算

有时候,需要分组计算均值标准差,或者看gear不同水平下的最大值最小值,那么就用到group_by()summarise() 函数。
譬如,对不同gear计算mpg的均值及标准差。或者根据am及gear分组计算mpg均值标注差。

# group by gear
df %>% 
   group_by(gear) %>% 
   summarise(mean=mean(mpg),
             sd=sd(mpg))
# A tibble: 3 x 3
   gear  mean    sd
  <dbl> <dbl> <dbl>
1     3  16.1  3.37
2     4  24.5  5.28
3     5  21.4  6.66
# gear +am
df %>% 
  group_by(gear,am) %>% 
  summarise(mean=mean(mpg),
            sd=sd(mpg))
# A tibble: 4 x 4
# Groups:   gear [3]
   gear    am  mean    sd
  <dbl> <dbl> <dbl> <dbl>
1     3     0  16.1  3.37
2     4     0  21.0  3.07
3     4     1  26.3  5.41
4     5     1  21.4  6.66
            

6.数据转换

有时候,处理数据时候,需要对变量类型进行转换,譬如字符串,因子及数值类型相互转换,上述数据里面dbl 意思是数值类型(double class)我们现在产生新的字符串chr及因子fct。使用mutate函数。可以看到mpg1与new都变成了chrfct
提取new,看一下。

# transfer
df = mtcars %>% as.tbl() %>% 
  dplyr::select(mpg,cyl,am,gear) %>% 
  mutate(mpg1=as.character(mpg),
         new=factor(am))

df
# A tibble: 32 x 6
     mpg   cyl    am  gear mpg1  new  
   <dbl> <dbl> <dbl> <dbl> <chr> <fct>
 1  21       6     1     4 21    1    
 2  21       6     1     4 21    1    
 3  22.8     4     1     4 22.8  1    
 4  21.4     6     0     3 21.4  0    
 5  18.7     8     0     3 18.7  0    
 6  18.1     6     0     3 18.1  0    
 7  14.3     8     0     3 14.3  0    
 8  24.4     4     0     4 24.4  0    
 9  22.8     4     0     4 22.8  0    
10  19.2     6     0     4 19.2  0    
# … with 22 more rows

summary(df)
df %>% dplyr::select(new) %>% pull()

有时候,会需要将连续性的变量,转换成分类变量。这时候就需要用到ifelse函数(转换成二分类变量),或者cut函数转换成多类别变量。代码如下

df = mtcars %>% as.tbl() %>% 
  dplyr::select(mpg,cyl,am,gear) %>% 
  mutate(mpg1=ifelse(mpg<25,"yes","no"),
         mpg2=factor(mpg1),
         mpg3=cut_number(mpg, n = 4),
         mpg4=cut(mpg,breaks=c(-Inf,20,40,Inf),labels=c("low","middle","high"))
         )

df

未完待续。。。
下一期介绍,如何转变行列及合并两个数据集。
具体详细内容,可前往Data Transformation with dplyr : : CHEAT SHEET

cankao

  1. tibble
  2. A Grammar of Data Manipulation • dplyr
  3. R for Data Science
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容