使用dplyr包处理数据-学习笔记

# dplyr 基础

  • 按值筛选观测 filter()

  • 对行进行重新排序 arrange()

  • 按名称选取列变量 select()

  • 使用现有变量的函数创建新变量 mutate()

  • 将多个值总结为一个摘要统计量 summarize()

  • 以上函数与group_by()函数连用,group_by()可以改变函数的作用范围;让其从整个数据集上的操作变为在每个分组上的分别操作 group_by()

# 数据
nycflights13::flights, 2013年从纽约出发的336 776次航班的信息。

> install.packages("nycflights13")
> library(dplyr)
> library(nycflights13)
> head(flights)
# A tibble: 6 x 19
   year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest  air_time
  <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>     <dbl> <chr>    <int> <chr>   <chr>  <chr>    <dbl>
1  2013     1     1      517            515         2      830            819        11 UA        1545 N14228  EWR    IAH        227
2  2013     1     1      533            529         4      850            830        20 UA        1714 N24211  LGA    IAH        227
# ... with 4 more variables: distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

# 使用filter()筛选行
filter(.data, ...)
.data是数据框;
...:后面可以是一个或多个参数,但必须是逻辑值,从而保证为TRUE的行才保留。

#筛选1月1日的航班
> filter(flights,month==1,day==1)
# A tibble: 842 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest  air_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>     <dbl> <chr>    <int> <chr>   <chr>  <chr>    <dbl>
 1  2013     1     1      517            515         2      830            819        11 UA        1545 N14228  EWR    IAH        227

## 比较运算符
>, >=, <, <=, !=, ==
浮点数相等使用near()代替==

## 逻辑运算符
& 表示“与”, | 表示“或”, !表示“非”, xor(x,y) 表示“异或”

> x <- c(T,T,F)
> y <- c(F,T,F)
> xor(x,y)
[1]  TRUE FALSE FALSE

## 缺失值
NA:not available, 不可用;
is.NA()
# 使用arrange()排列行
arrange(.data, ...)
.data:数据框
...:变量名,多个变量名使用逗号隔开; arrange()将根据这些列对数据框进行排序;

> arrange(flights,year,month,day)
# A tibble: 336,776 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest  air_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>     <dbl> <chr>    <int> <chr>   <chr>  <chr>    <dbl>
 1  2013     1     1      517            515         2      830            819        11 UA        1545 N14228  EWR    IAH        227
 2  2013     1     1      533            529         4      850            830        20 UA        1714 N24211  LGA    IAH        227

使用desc() 可以按列进行降序排序:

> arrange(flights,desc(arr_delay))

# 使用select()选择列
select(.data, ...):keeps only the variables you mention

> select(flights,year,month,day)
> select(flights,year,month,day)
# A tibble: 336,776 x 3
    year month   day
   <int> <int> <int>
 1  2013     1     1
 2  2013     1     1
 3  2013     1     1
 4  2013     1     1
 5  2013     1     1
 6  2013     1     1
 7  2013     1     1
 8  2013     1     1
 9  2013     1     1
10  2013     1     1
# ... with 336,766 more rows
> select(flights,year:day)
> select(flights,-(year:day))  #删除列

select()函数可以结合一些辅助函数使用:
start_with("abc"): 匹配“abc”开头
ends_with(): 匹配“xyz” 结尾的名称
contains("ijk"): 匹配包含“ijk”的名称
mathces("(.)\1"): 匹配名称中有重复字符的变量;(.)匹配单个字符;\\1指定第一个子匹配项, 第二个匹配模式也是(.)。
num_range("x",1:3): 匹配x1、x2和x3
rename(): 可以对数据框中变量名重命名。

> rename(flights,tail_num = tailnum)
# A tibble: 336,776 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>     <dbl> <chr>    <int>
 1  2013     1     1      517            515         2      830            819        11 UA        1545
 2  2013     1     1      533            529         4      850            830        20 UA        1714
# ... with 336,766 more rows, and 8 more variables: tail_num <chr>, origin <chr>, dest <chr>,
#   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

# 使用mutate添加新变量
mutate()总是将新列添加在数据集的最后

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

>mutate(iris,newCol1=iris$Sepal.Length*2,newCol2=paste(iris$Species,iris$Sepal.Length,sep = ""))
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species newCol1       newCol2
1            5.1         3.5          1.4         0.2     setosa    10.2     setosa5.1
2            4.9         3.0          1.4         0.2     setosa     9.8     setosa4.9
3            4.7         3.2          1.3         0.2     setosa     9.4     setosa4.7
4            4.6         3.1          1.5         0.2     setosa     9.2     setosa4.6
5            5.0         3.6          1.4         0.2     setosa    10.0       setosa5

transmute()只保留新变量

>transmute(iris,newCol1=iris$Sepal.Length*2,newCol2=paste(iris$Species,iris$Sepal.Length,sep = ""))
    newCol1       newCol2
1      10.2     setosa5.1
2       9.8     setosa4.9
3       9.4     setosa4.7
4       9.2     setosa4.6
5      10.0       setosa5

# 使用summarize()进行分组摘要

group_by()可以将分析单位从整个数据集改为单个分组
ungroup()可以取消分组

> bySpecies<-group_by(iris,Species)
> summarize(bySpecies, meanCol=mean(iris$Sepal.Length,na.rm = T))
# A tibble: 3 x 2
  Species    meanCol
  <fct>        <dbl>
1 setosa        5.84
2 versicolor    5.84
3 virginica     5.84
> by_day<-group_by(flights,year,month,day)  #flights中year,month,day各水平一一组合

使用管道操作: %>%,输入数据或者计算结果通过%>%直接传递给下一步操作

by_dest<-group_by(flights,dest)
delay<-summarize(by_dest,
                 count=n(),  #n()是一个计数函数
                 dist=mean(distance,na.rm=T),
                 delay=mean(arr_delay,na.rm = T))

delay<-filter(delay,count>20,dest != "HNL")


by_dest<-flights %>%
  group_by(dest)%>%
  summarize(
    count=n(),
    dist=mean(distance,na.rm=T),
    delay=mean(arr_delay,na.rm = T)
    )%>%
  filter(count>20,dest != "HNL")

参考:
R数据科学

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

推荐阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,648评论 5 116
  • 1. 数据操作:dplyr包应用 dplyr包是为数据分析提供了一系列快捷有效的操作,其中有五个关键函数基本可以解...
    100gle阅读 3,392评论 0 7
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,867评论 0 9
  • 不断更新,丰富自己的知识,训练自己的逻辑思维,强化执行能力,而这一切都是需要时间来沉淀和累积的,所有的良好的习惯都...
    Fineyoga林丹阅读 203评论 0 1
  • 鲁迅的《呐喊》、《彷徨》,从小到大,我想也读了不下四五回了吧,每次读都是沉重的,只觉得这世上除了这鲁迅先生,没人是...
    蛋挞米糊阅读 133评论 0 0