精华内容
下载资源
问答
  • dplyr-learnr dplyr(tidyverse的一部分)中一些常用功能的丰富多彩介绍。
  • replyr, 使用dplyr与数据库和大数据的补丁 replyr 正在进入维护模式。 很难跟踪移动 dplyr/dbplyr/rlang api和 dplyr 0.5的数据结构。 它现在做的大多数事情在我们的一个较新的非单片包中做得更好:编程和元编程工具...
  • dplyr实例使用案例,主要用于清洗数据,整理数据使用。是不可多得的改进包
  • dbplyr:dplyr的数据库(DBI)后端
  • dplyr.snowflakedb 这个R包扩展了以增加对后端支持。 有关dplyr更多详细信息,可以在该项目的页面中找到。 R环境设置 与SnowflakeDB的dplyr.snowflakedb连接使用RJDBC包,但是,需要安装rJava包并与Java 8配合使用...
  • 项目名称:dplyr 这些是dplyr研讨会的项目文件。 有用的日期 上次更新时间:2021-03-02 研讨会演讲:2021-03-05 作者姓名和联系方式 珍妮弗·哈克(Jennifer Huck) 数据图书馆员 UVA库 数据来源 我们依靠由UVA ...
  • vertica.dplyr 用户指南 马华 2015-07-30 rmarkdown::html_vignette %\VignetteIndexEntry{vertica.dplyr 用户指南} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} vertica.dplyr vertica.dplyr ...
  • R语言dplyr包实操

    千次阅读 2020-06-25 09:00:00
    1. dplyr简介dplyr是R语言的数据分析包,类似于python中的pandas,能对dataframe类型的数据做很方便的数据处理和分析操作。最初我也很奇怪dplyr这个奇怪的名...

    1. dplyr简介

    dplyr是R语言的数据分析包,类似于python中的pandas,能对dataframe类型的数据做很方便的数据处理和分析操作。最初我也很奇怪dplyr这个奇怪的名字,我查到其中一种解释 - d代表dataframe - plyr是英文钳子plier的谐音

    dplyr如同R的大多数包,都是函数式编程,这点跟Python面向对象编程区别很大。优点是初学者比较容易接受这种函数式思维,有点类似于流水线,每个函数就是一个车间,多个车间共同完成一个生产(数据分析)任务。

    而在dplyr中,就有一个管道符 %>% ,符号左侧表示数据的输入,右侧表示下游数据处理环节。


    2. 安装并导入dplyr库

    pacman库的p_load函数功能包含了

    1. install.packages(“dplyr”)

    2. library(dplyr)

    该写法更简单易用

    pacman::p_load("dplyr")
    

    3. 读取数据

    #设置工作目录
    setwd("/Users/thunderhit/Desktop/dplyr_learn")
    
    #导入csv数据
    aapl <- read.csv('aapl.csv', 
                     header=TRUE,
                     sep=',',
                     stringsAsFactors = FALSE) %>% as_tibble()
    head(aapl)
    
    A tibble: 6 × 6
    DateOpenHighLowCloseVolume
    <chr><dbl><dbl><dbl><dbl><int>
    7-Jul-17142.90144.75142.90144.1819201712
    6-Jul-17143.02143.50142.41142.7324128782
    5-Jul-17143.69144.79142.72144.0921569557
    3-Jul-17144.88145.30143.10143.5014277848
    30-Jun-17144.45144.96143.78144.0223024107
    29-Jun-17144.71145.13142.28143.6831499368

    查看数据类型

    class(aapl)
    
    1. 'tbl_df'

    2. 'tbl'

    3. 'data.frame'

    查看数据的字段

    colnames(aapl)
    
    1. 'Date'

    2. 'Open'

    3. 'High'

    4. 'Low'

    5. 'Close'

    6. 'Volume'

    查看记录数、字段数

    dim(aapl)
    
    1. 251

    2. 6


    4. dplyr常用函数

    4.1 Arrange

    对appl数据按照字段Volume进行降序排序

    arrange(aapl, -Volume)
    
    A tibble: 6 × 6
    DateOpenHighLowCloseVolume
    <chr><dbl><dbl><dbl><dbl><int>
    14-Sep-16108.73113.03108.60111.77112340318
    1-Feb-17127.03130.49127.01128.75111985040
    27-Jul-16104.26104.35102.75102.9592344820
    15-Sep-16113.86115.73113.49115.5790613177
    16-Sep-16115.12116.13114.04114.9279886911
    12-Jun-17145.74146.09142.51145.4272307330

    我们也可以用管道符 %>% ,两种写法得到的运行结果是一致的,可能用久了会觉得管道符 %>% 可读性更强,后面我们都会用 %>% 来写代码。

    aapl %>% arrange(-Volume)
    
    A tibble: 6 × 6
    DateOpenHighLowCloseVolume
    <chr><dbl><dbl><dbl><dbl><int>
    14-Sep-16108.73113.03108.60111.77112340318
    1-Feb-17127.03130.49127.01128.75111985040
    27-Jul-16104.26104.35102.75102.9592344820
    15-Sep-16113.86115.73113.49115.5790613177
    16-Sep-16115.12116.13114.04114.9279886911
    12-Jun-17145.74146.09142.51145.4272307330

    4.2 Select

    选取 Date、Close和Volume三列

    aapl %>% select(Date, Close, Volume)
    
    A tibble: 6 × 3
    DateCloseVolume
    <chr><dbl><int>
    7-Jul-17144.1819201712
    6-Jul-17142.7324128782
    5-Jul-17144.0921569557
    3-Jul-17143.5014277848
    30-Jun-17144.0223024107
    29-Jun-17143.6831499368

    只选取Date、Close和Volume三列,其实另外一种表达方式是“排除Open、High、Low,选择剩下的字段的数据”。

    aapl %>% select(-c("Open", "High", "Low")) 
    
    A tibble: 6 × 3
    DateCloseVolume
    <chr><dbl><int>
    7-Jul-17144.1819201712
    6-Jul-17142.7324128782
    5-Jul-17144.0921569557
    3-Jul-17143.5014277848
    30-Jun-17144.0223024107
    29-Jun-17143.6831499368

    4.3 Filter

    按照筛选条件选择数据

    #从数据中选择appl股价大于150美元的交易数据
    aapl %>% filter(Close>=150) 
    
    A tibble: 6 × 6
    DateOpenHighLowCloseVolume
    <chr><dbl><dbl><dbl><dbl><int>
    8-Jun-17155.25155.54154.40154.9921250798
    7-Jun-17155.02155.98154.48155.3721069647
    6-Jun-17153.90155.81153.78154.4526624926
    5-Jun-17154.34154.45153.46153.9325331662
    2-Jun-17153.58155.45152.89155.4527770715
    1-Jun-17153.17153.33152.22153.1816404088

    从数据中选择appl - 股价大于150美元 且 收盘价大于开盘价 的交易数据

    aapl %>% filter((Close>=150) & (Close>Open))
    
    A tibble: 11 × 6
    DateOpenHighLowCloseVolume
    <chr><dbl><dbl><dbl><dbl><int>
    7-Jun-17155.02155.98154.48155.3721069647
    6-Jun-17153.90155.81153.78154.4526624926
    2-Jun-17153.58155.45152.89155.4527770715
    1-Jun-17153.17153.33152.22153.1816404088
    30-May-17153.42154.43153.33153.6720126851
    25-May-17153.73154.35153.03153.8719235598
    18-May-17151.27153.34151.13152.5433568215
    12-May-17154.70156.42154.67156.1032527017
    11-May-17152.45154.07152.31153.9527255058
    9-May-17153.87154.88153.45153.9939130363
    8-May-17149.03153.70149.03153.0148752413

    4.4 Mutate

    将现有的字段经过计算后生成新字段。

    #将最好价High减去最低价Low的结果定义为maxDif,并取log
    aapl %>% mutate(maxDif = High-Low,
                    log_maxDif=log(maxDif)) 
    
    A tibble: 6 × 8
    DateOpenHighLowCloseVolumemaxDiflog_maxDif
    <chr><dbl><dbl><dbl><dbl><int><dbl><dbl>
    7-Jul-17142.90144.75142.90144.18192017121.850.6151856
    6-Jul-17143.02143.50142.41142.73241287821.090.0861777
    5-Jul-17143.69144.79142.72144.09215695572.070.7275486
    3-Jul-17144.88145.30143.10143.50142778482.200.7884574
    30-Jun-17144.45144.96143.78144.02230241071.180.1655144
    29-Jun-17144.71145.13142.28143.68314993682.851.0473190

    得到记录的位置(行数)

    aapl  %>% mutate(n=row_number())  
    
    A tibble: 6 × 7
    DateOpenHighLowCloseVolumen
    <chr><dbl><dbl><dbl><dbl><int><int>
    7-Jul-17142.90144.75142.90144.18192017121
    6-Jul-17143.02143.50142.41142.73241287822
    5-Jul-17143.69144.79142.72144.09215695573
    3-Jul-17144.88145.30143.10143.50142778484
    30-Jun-17144.45144.96143.78144.02230241075
    29-Jun-17144.71145.13142.28143.68314993686

    4.5 Group_By

    对资料进行分组,这里导入新的 数据集 weather

    #导入csv数据
    weather <- read.csv('weather.csv', 
                        header=TRUE,
                        sep=',',
                        stringsAsFactors = FALSE) %>% as_tibble()  
    weather 
    
    A tibble: 6 × 5
    Datecitytemperaturewindspeedevent
    <chr><chr><int><int><chr>
    1/1/2017new york326Rain
    1/1/2017mumbai905Sunny
    1/1/2017paris4520Sunny
    1/2/2017new york367Sunny
    1/2/2017mumbai8512Fog
    1/2/2017paris5013Cloudy

    按照城市分组

    weather %>% group_by(city) 
    
    A grouped_df: 6 × 5
    Datecitytemperaturewindspeedevent
    <chr><chr><int><int><chr>
    1/1/2017new york326Rain
    1/1/2017mumbai905Sunny
    1/1/2017paris4520Sunny
    1/2/2017new york367Sunny
    1/2/2017mumbai8512Fog
    1/2/2017paris5013Cloudy

    为了让大家看到分组的功效,咱们按照城市分别计算平均温度

    weather %>% group_by(city) %>% summarise(mean_temperature = mean(temperature))
    
    `summarise()` ungrouping output (override with `.groups` argument)
    
    A tibble: 3 × 2
    citymean_temperature
    <chr><dbl>
    mumbai87.5
    new york34.0
    paris47.5
    weather %>%  summarise(mean_temperature = mean(temperature))
    
    A tibble: 1 × 1
    mean_temperature
    <dbl>
    56.33333
    往期文章小案例: Pandas的apply方法
    
    Python语法快速入门
    Python网络爬虫与文本数据分析
    读完本文你就了解什么是文本分析
    
    综述:文本分析在市场营销研究中的应用
    从记者的Twitter关注看他们稿件的党派倾向?
    
    Pandas时间序列数据操作
    70G上市公司定期报告数据集
    文本数据清洗之正则表达式
    shreport库: 批量下载上海证券交易所上市公司年报
    Numpy和Pandas性能改善的方法和技巧
    漂亮~pandas可以无缝衔接Bokeh
    YelpDaset: 酒店管理类数据集10+G
    半个小时学会Markdown标记语法
    
    

    后台回复关键词【dplyr实操】,可获得测试数据及代码

    展开全文
  • dplyr count 函数

    2021-11-07 10:09:14
    dplyr count 函数 count 函数计算数据集中列唯一值的数量。利用count可以方便地以表格形式展示变量的数量。本文通过示例说明如何使用该函数。 加载库 我们可以单独加载dplyr包,我建议直接加载 tidyverse 包,因为...

    dplyr count 函数

    count 函数计算数据集中列唯一值的数量。利用count可以方便地以表格形式展示变量的数量。本文通过示例说明如何使用该函数。

    加载库

    我们可以单独加载dplyr包,我建议直接加载 tidyverse 包,因为我们还要使用其他特性。

    library(tidyverse)
    
    

    加载数据

    我们加载 tidyverse中的mtcars数据集,利用glimpse函数看下数据概况。

    data("mtcars")
    glimpse(mtcars)
    
    # Rows: 32
    # Columns: 11
    # $ mpg  <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, ~
    # $ cyl  <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, ~
    # $ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, ~
    # $ hp   <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, ~
    # $ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, ~
    # $ wt   <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, ~
    # $ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, ~
    # $ vs   <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, ~
    # $ am   <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
    # $ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, ~
    # $ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, ~
    

    基础count函数

    我们用了两个参数,数据集mtcars以及要计算的列名:

    count(mtcars, cyl)
    
    #   cyl  n
    # 1   4 11
    # 2   6  7
    # 3   8 14
    
    # mtcars %>% count(cyl)
    

    结果返回数据框包括变量名称及对应数量,举例cyl为4的记录有11条。

    使用tidyversedplyr时,为了更加直观常应用管道符 %>%mtcars %>% count(cyl),返回结果一致。后面示例我们都使用管道符。

    count 排序

    mtcars %>% count(cyl, sort = TRUE)
    
    #   cyl  n
    # 1   8 14
    # 2   4 11
    # 3   6  7
    
    # 多列计数排序
    mtcars %>% count(cyl, gear , sort = TRUE)
    
    #   cyl am  n
    # 1   8  0 12
    # 2   4  1  8
    # 3   6  0  4
    # 4   4  0  3
    # 5   6  1  3
    # 6   8  1  2
    

    增加计算列计数

    我们也可以利用count函数增加计算列,当然也可以使用mutate函数。下面示例计算平均动力耗油率。

    mtcars %>% count(mgp_by_hp=round(mpg/hp,2), sort=TRUE)
    
    # 展示部分结果
    #    mgp_by_hp n
    # 1       0.05 3
    # 2       0.06 3
    # 3       0.10 3
    # 4       0.11 3
    # 5       0.19 3
    # 6       0.04 1
    # 7       0.08 1
    # 8       0.09 1
    # 9       0.14 1
    # 10      0.16 1
    

    计算权重

    前面示例都是计数,我们也可以通过参数wt指定计算权重,请看示例:

    mtcars %>% count(cyl, wt=mpg)
    #   cyl     n
    # 1   4 293.3
    # 2   6 138.2
    # 3   8 211.4
    mtcars %>% group_by(cyl) %>% summarise(sum(mpg)) %>% add_count()
    

    我们也可以使用分组计算验证结果。

    add_count增加计数列

    前面示例返回数据框仅指定列及计数n,如果我们要包括所有列并增加指定列的计数,可以使用add_count函数:

    mtcars %>% add_count(cyl, sort = TRUE)
    
    # 部分返回数据
    #     mpg cyl  disp  hp drat    wt  qsec vs am gear carb  n
    # 1  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2 14
    # 2  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4 14
    # 3  16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3 14
    # 4  17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3 14
    # 5  15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3 14
    # 6  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4 14
    # 7  10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4 14
    # 8  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4 14
    # 9  15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2 14
    # 10 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2 14
    # 11 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4 14
    # 12 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2 14
    # 13 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4 14
    # 14 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8 14
    # 15 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1 11
    

    我们看到cyl==8的记录有14条,最后增加n列值为14。

    展开全文
  • R语言入门——sqldf包 VS dplyr

    千次阅读 2021-01-09 15:28:18
    目录引言1、数据构造2、筛选2.1 dplyr::filter基本语法:案例2.2 sqldf:sqldf关键字select、from、where、where3、排序3.1 dplyr::arrange3.2 sqldf:sqldf关键字:order by4、选择列4.1dplyr::select4.2 sqldf::...

    引言

    R语言里有诸多处理数据的函数包。因为习惯使用数据库sql的缘故平时处理数据用sqldf这个包调用sql命令比较多一些。但是R语言作为数据分析工具,受很多数据分析人员的偏爱他还是有一定原因的。他自己拥有很多高效处理转换数据的表dplyr就是其中一个,今天本文从这两个包出发,从数据筛选、数据排序、选择变量、增加变量、数据排序等五个角度对比一下这两个函数包。

    1、数据构造

    本人是王者荣耀忠实玩家,自2016年上大学入坑,断断续续的玩想来已有4年半,今天就构造的数据就以王者荣耀为背景。
    当然最开始导入本文所需要的两个主角包。

    # 包的导入
    > library(dplyr)
    > library(sqldf)
    

    注:dplyr包的载入会覆盖一下其他包的函数,具体解决措施见R语言入门——包的函数被覆盖,里面有应对办法。

    # 构造数据
    > Data <- data.frame(
    +   英雄 = c("后裔", "孙尚香", "狄仁杰", "李元芳", "安琪拉", "张良", "不知火舞", "貂蝉"),
    +   职业 = c("射手", "射手", "射手", "射手", "法师", "法师", "法师", "法师"),
    +   熟练等级 = c(5, 5, 5, 4, 5, 4, 4, 3),
    +   使用频次 = c(856, 211, 324, 75, 2324, 755, 644, 982),
    +   胜率 = c(sqrt(0.64)^2, (1:7)/10)
    + )
    > Data
          英雄 职业 熟练等级 使用频次 胜率
    1     后裔 射手        5      856 0.64
    2   孙尚香 射手        5      211 0.10
    3   狄仁杰 射手        5      324 0.20
    4   李元芳 射手        4       75 0.30
    5   安琪拉 法师        5     2324 0.40
    6     张良 法师        4      755 0.50
    7 不知火舞 法师        4      644 0.60
    8     貂蝉 法师        3      982 0.70
    

    共有5个变量,8次观测。

    2、筛选

    2.1 dplyr::filter

    基本语法:

    filter(数据, 逻辑语句)
    

    案例

    > filter(Data, 英雄 == "不知火舞")
          英雄 职业 熟练等级 使用频次 胜率
    1 不知火舞 法师        4      644  0.6
    > filter(Data, 职业 == "法师")
          英雄 职业 熟练等级 使用频次 胜率
    1   安琪拉 法师        5     2324  0.4
    2     张良 法师        4      755  0.5
    3 不知火舞 法师        4      644  0.6
    4     貂蝉 法师        3      982  0.7
    > filter(Data, 职业 == "射手"&熟练等级 == 5)
        英雄 职业 熟练等级 使用频次 胜率
    1   后裔 射手        5      856 0.64
    2 孙尚香 射手        5      211 0.10
    3 狄仁杰 射手        5      324 0.20
    > filter(Data, 胜率 == 0.1)
        英雄 职业 熟练等级 使用频次 胜率
    1 孙尚香 射手        5      211  0.1
    > filter(Data, 胜率 == 0.64)
    [1] 英雄     职业     熟练等级 使用频次 胜率    
    <0> (0-长度的row.names)
    > filter(Data, between(胜率, 0.1, 0.4))
        英雄 职业 熟练等级 使用频次 胜率
    1 孙尚香 射手        5      211  0.1
    2 狄仁杰 射手        5      324  0.2
    3 李元芳 射手        4       75  0.3
    4 安琪拉 法师        5     2324  0.4
    > filter(Data, near(胜率, 0.64))
      英雄 职业 熟练等级 使用频次 胜率
    1 后裔 射手        5      856 0.64
    

    注:在使用filter函数进行筛选数据时,注意和between,near函数的结合。该函数与基础包里subset函数功能相似。

    between函数是用来取连续的连续变量,near函数是用来取浮点型的数据。

    > near(sqrt(0.64)^2, 0.64)
    [1] TRUE
    > sqrt(0.64)^2 == 0.64
    [1] FALSE
    

    2.2 sqldf:sqldf

    关键字select、from、where、where

    sqldf也可以通过下面命令完成上述的相同的任务:

    > sqldf("
    + select * from Data where 英雄 == '不知火舞'
    + ")
          英雄 职业 熟练等级 使用频次 胜率
    1 不知火舞 法师        4      644  0.6
    > sqldf("
    + select * from Data where 职业 == '射手' and 熟练等级 == 5
    + ")
        英雄 职业 熟练等级 使用频次 胜率
    1   后裔 射手        5      856 0.64
    2 孙尚香 射手        5      211 0.10
    3 狄仁杰 射手        5      324 0.20
    > sqldf("
    + select * from Data where 胜率 between 0.1 and 0.4
    + ")
        英雄 职业 熟练等级 使用频次 胜率
    1 孙尚香 射手        5      211  0.1
    2 狄仁杰 射手        5      324  0.2
    3 李元芳 射手        4       75  0.3
    4 安琪拉 法师        5     2324  0.4
    > sqldf("
    + select * from Data where 胜率 == 0.64
    + ")
    [1] 英雄     职业     熟练等级 使用频次 胜率    
    <0> (0-长度的row.names)
    > sqldf("
    + select * from Data where 胜率 between (0.64-0.0001) and (0.64+0.0001)
    + ")
      英雄 职业 熟练等级 使用频次 胜率
    1 后裔 射手        5      856 0.64
    

    3、排序

    3.1 dplyr::arrange

    > Data
          英雄 职业 熟练等级 使用频次 胜率
    1     后裔 射手        5      856 0.64
    2   孙尚香 射手        5      211 0.10
    3   狄仁杰 射手        5      324 0.20
    4   李元芳 射手        4       75 0.30
    5   安琪拉 法师        5     2324 0.40
    6     张良 法师        4      755 0.50
    7 不知火舞 法师        4      644 0.60
    8     貂蝉 法师        3      982 0.70
    > arrange(Data, 熟练等级)  # 默认升序
          英雄 职业 熟练等级 使用频次 胜率
    1     貂蝉 法师        3      982 0.70
    2   李元芳 射手        4       75 0.30
    3     张良 法师        4      755 0.50
    4 不知火舞 法师        4      644 0.60
    5     后裔 射手        5      856 0.64
    6   孙尚香 射手        5      211 0.10
    7   狄仁杰 射手        5      324 0.20
    8   安琪拉 法师        5     2324 0.40
    > arrange(Data, desc(熟练等级))  # 降序
          英雄 职业 熟练等级 使用频次 胜率
    1     后裔 射手        5      856 0.64
    2   孙尚香 射手        5      211 0.10
    3   狄仁杰 射手        5      324 0.20
    4   安琪拉 法师        5     2324 0.40
    5   李元芳 射手        4       75 0.30
    6     张良 法师        4      755 0.50
    7 不知火舞 法师        4      644 0.60
    8     貂蝉 法师        3      982 0.70
    > # 熟练等级降序,使用频次升序
    > arrange(Data, desc(熟练等级), 使用频次 )
          英雄 职业 熟练等级 使用频次 胜率
    1   孙尚香 射手        5      211 0.10
    2   狄仁杰 射手        5      324 0.20
    3     后裔 射手        5      856 0.64
    4   安琪拉 法师        5     2324 0.40
    5   李元芳 射手        4       75 0.30
    6 不知火舞 法师        4      644 0.60
    7     张良 法师        4      755 0.50
    8     貂蝉 法师        3      982 0.70
    

    3.2 sqldf:sqldf

    关键字:order by

    > sqldf("
    + select * from Data  order by 熟练等级
    + ")  # 默认升序
          英雄 职业 熟练等级 使用频次 胜率
    1     貂蝉 法师        3      982 0.70
    2   李元芳 射手        4       75 0.30
    3     张良 法师        4      755 0.50
    4 不知火舞 法师        4      644 0.60
    5     后裔 射手        5      856 0.64
    6   孙尚香 射手        5      211 0.10
    7   狄仁杰 射手        5      324 0.20
    8   安琪拉 法师        5     2324 0.40
    > sqldf("
    + select * from Data order by 熟练等级 desc
    + ")  # 降序
          英雄 职业 熟练等级 使用频次 胜率
    1     后裔 射手        5      856 0.64
    2   孙尚香 射手        5      211 0.10
    3   狄仁杰 射手        5      324 0.20
    4   安琪拉 法师        5     2324 0.40
    5   李元芳 射手        4       75 0.30
    6     张良 法师        4      755 0.50
    7 不知火舞 法师        4      644 0.60
    8     貂蝉 法师        3      982 0.70
    > # 熟练等级降序,使用频次升序
    > sqldf("
    + select * from Data order by 熟练等级 desc, 使用频次
    + ") 
          英雄 职业 熟练等级 使用频次 胜率
    1   孙尚香 射手        5      211 0.10
    2   狄仁杰 射手        5      324 0.20
    3     后裔 射手        5      856 0.64
    4   安琪拉 法师        5     2324 0.40
    5   李元芳 射手        4       75 0.30
    6 不知火舞 法师        4      644 0.60
    7     张良 法师        4      755 0.50
    8     貂蝉 法师        3      982 0.70
    

    4、选择列

    4.1dplyr::select

    函数select在选择列的时候可以与正则表达式进行结合。这里给出例子进行说明。

    > select(Data, 英雄, 熟练等级, 胜率)
          英雄 熟练等级 胜率
    1     后裔        5 0.64
    2   孙尚香        5 0.10
    3   狄仁杰        5 0.20
    4   李元芳        4 0.30
    5   安琪拉        5 0.40
    6     张良        4 0.50
    7 不知火舞        4 0.60
    8     貂蝉        3 0.70
    > select(Data, -使用频次)
          英雄 职业 熟练等级 胜率
    1     后裔 射手        5 0.64
    2   孙尚香 射手        5 0.10
    3   狄仁杰 射手        5 0.20
    4   李元芳 射手        4 0.30
    5   安琪拉 法师        5 0.40
    6     张良 法师        4 0.50
    7 不知火舞 法师        4 0.60
    8     貂蝉 法师        3 0.70
    > # 正则表达式的结合
    > select(Data, starts_with("英"))  # “英”开头
          英雄
    1     后裔
    2   孙尚香
    3   狄仁杰
    4   李元芳
    5   安琪拉
    6     张良
    7 不知火舞
    8     貂蝉
    > select(Data, ends_with("雄"))  # “雄”结尾
          英雄
    1     后裔
    2   孙尚香
    3   狄仁杰
    4   李元芳
    5   安琪拉
    6     张良
    7 不知火舞
    8     貂蝉
    > select(Data, contains("等"))  # 名字中含有“等”
      熟练等级
    1        5
    2        5
    3        5
    4        4
    5        5
    6        4
    7        4
    8        3
    

    4.2 sqldf::select

    > sqldf("
    + select 英雄, 熟练等级, 胜率 from Data
    + ")
          英雄 熟练等级 胜率
    1     后裔        5 0.64
    2   孙尚香        5 0.10
    3   狄仁杰        5 0.20
    4   李元芳        4 0.30
    5   安琪拉        5 0.40
    6     张良        4 0.50
    7 不知火舞        4 0.60
    8     貂蝉        3 0.70
    

    5、创建新的变量

    5.1 dplyr::mutate

    > mutate(Data, rew等级 = 熟练等级 + 1)
          英雄 职业 熟练等级 使用频次 胜率 rew等级
    1     后裔 射手        5      856 0.64       6
    2   孙尚香 射手        5      211 0.10       6
    3   狄仁杰 射手        5      324 0.20       6
    4   李元芳 射手        4       75 0.30       5
    5   安琪拉 法师        5     2324 0.40       6
    6     张良 法师        4      755 0.50       5
    7 不知火舞 法师        4      644 0.60       5
    8     貂蝉 法师        3      982 0.70       4
    > mutate(Data, rew使用频次 = 使用频次 / 100)
          英雄 职业 熟练等级 使用频次 胜率 rew使用频次
    1     后裔 射手        5      856 0.64        8.56
    2   孙尚香 射手        5      211 0.10        2.11
    3   狄仁杰 射手        5      324 0.20        3.24
    4   李元芳 射手        4       75 0.30        0.75
    5   安琪拉 法师        5     2324 0.40       23.24
    6     张良 法师        4      755 0.50        7.55
    7 不知火舞 法师        4      644 0.60        6.44
    8     貂蝉 法师        3      982 0.70        9.82
    

    5.2 sqldf::select

    关键字:as

    > sqldf("
    + select
    +  *, (熟练等级 + 1) as rew等级,(使用频次)/100 as rew使用频次 
    + from Data
    + ")
          英雄 职业 熟练等级 使用频次 胜率 rew等级 rew使用频次
    1     后裔 射手        5      856 0.64       6        8.56
    2   孙尚香 射手        5      211 0.10       6        2.11
    3   狄仁杰 射手        5      324 0.20       6        3.24
    4   李元芳 射手        4       75 0.30       5        0.75
    5   安琪拉 法师        5     2324 0.40       6       23.24
    6     张良 法师        4      755 0.50       5        7.55
    7 不知火舞 法师        4      644 0.60       5        6.44
    8     貂蝉 法师        3      982 0.70       4        9.82
    

    6、分组聚合

    6.1 dplyr::summarize(group_by)

    > summarize(group_by(Data, 职业),
    +  delay = mean(熟练等级, na.rm = TRUE))
    # A tibble: 2 x 2
      职业  delay
      <fct> <dbl>
    1 法师   4   
    2 射手   4.75
    

    6.2 sqldf::select

    关键字:group by

    > str(Data)
    'data.frame':   8 obs. of  5 variables:
     $ 英雄    : Factor w/ 8 levels "安琪拉","不知火舞",..: 5 7 3 6 1 8 2 4
     $ 职业    : Factor w/ 2 levels "法师","射手": 2 2 2 2 1 1 1 1
     $ 熟练等级: num  5 5 5 4 5 4 4 3
     $ 使用频次: num  856 211 324 75 2324 ...
     $ 胜率    : num  0.64 0.1 0.2 0.3 0.4 0.5 0.6 0.7
    > sqldf("
    + select
    + 职业, avg(熟练等级) as 等级均值
    + from Data group by 职业
    + ") 
      职业 等级均值
    1 射手     4.75
    2 法师     4.00
    

    7、总结

    本文从数据筛选、数据排序、选择变量、增加变量、数据排序五个任务角度,介绍了包dplyr中五个核心函数,以及sql的部分实用关键字:

    功能函数sqldf关键字
    筛选逻辑值filter()dplyrselect、where、between
    排序arrange()dplyrdesc
    选变量select()dplyrselect
    创建新变量mutate())dplyras
    分组摘要统计summarize()dplyrgroup by

    最后希望可以帮助大家学习R语言。水平有限发现错误还望及时评论区指正,您的意见和批评是我不断前进的动力。

    展开全文
  • dplyr是R语言的数据分析包,类似于python中的pandas,能对dataframe类型的数据做很方便的数据处理和分析操作

    dplyr简介

    dplyr是R语言的数据分析包,类似于python中的pandas,能对dataframe类型的数据做很方便的数据处理和分析操作。

    安装并导入dplyr包

    install.packages("dplyr")
    library(dplyr)
    

    准备测试数据

    我们使用dplyr包中内置的starwars数据集作为测试数据

    starwars    #查看starwars数据集中的数据
    class(starwars)     # 查看数据类型
    colnames(starwars)    #查看数据的字段
    dim(starwars)     #  查看dataframe的大小
    

    如果你是从外部读入数据或自己构造的数据,那么在dplyr包中内可以首先将的数据整理成更友好的tbl_df数据:

    #先查看数据类型
    data <- data.frame(person=c('Alex','Bob','Cathy'),grade=c(2,3,4),score=c(78,89,88))
    class(data)
    #转换为tbl_df类型
    ds <- tbl_df(data)
    #转换为data.frame类型
    df <- as.data.frame(ds)
    

    管道符 %>%

    在dplyr中有一个比较有特色的管道符 %>% 有必要先说明一下,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存。该符号将左边的对象作为第一个参数传递到右边的函数中.
    举个例子来说,在上面查看数据集的字段中我们使用语句colnames(starwars),用管道符%>%来写的话就是starwars %>% colnames()

    #管道函数
    #默认是传递至后面函数的第一个参数
    df %>% head(2)
      a b
    1 1 a
    2 2 b
    #当需要传递至后面函数的非第一个参数时,使用“.”代替
    "a_b" %>% str_c("c_", ., sep = "")
    [1] "c_a_b"
    

    dplyr常用函数

    排列Arrange

    arrange()按给定的列名依次对行进行排序,语法为arrange(.data, ...)

    arrange(starwars, height)  #升序排列
    arrange(starwars, -height)  #降序排列
    arrange(starwars, desc(height))  #降序排列,使用desc()函数
    starwars %>% arrange(-height)  #管道函数方法:降序排列
    

    选择Select

    select()用列名作参数来选择子数据集。dplyr包中提供了些特殊功能的函数与select函数结合使用, 用于筛选变量,包括starts_with,ends_with,contains,matches,one_of,num_range和everything等。语法 为select(.data, ...)

    #选取多列
    select(starwars, name,height,mass,hair_color)
    #选取多列并改变顺序
    select(starwars, height,mass,name,hair_color)
    #选取列名以s开始的列
    select(starwars, starts_with("s"))
    #选取列名后缀包含color的列
    select(starwars, ends_with("color"))
    #选取列名后缀不包含color的列
    select(starwars, -ends_with("color"))
    #选取列名中包含_的列
    select(starwars, contains("_"))
    #正则表达式匹配,返回变量名中包含t的列
    select(starwars, matches(".t."))
    #使用冒号连接列名,选择多个列
    select(starwars, name:hair_color)
    #选择字符向量中的列,select中不能直接使用字符向量筛选,需要使用one_of函数
    vars <- c("name", "hair_color")
    select(starwars, one_of(vars))
    #返回指定字符向量之外的列
    select(starwars, -one_of(vars))
    #返回所有列,一般调整数据集中变量顺序时使用,例如把hair_color列放到最前面
    select(starwars, hair_color, everything())
    

    select也可以用来重命名:

    #重命名列hair_color,返回子数据集只包含重命名的列
    select(starwars, haircolor = hair_color)
    #重命名所有以color为后缀的列,返回子数据集只包含重命名的列
    select(starwars, color = ends_with("color"))
    #重命名列hair_color,返回全部列,使用rename函数
    rename(starwars,, haircolor = hair_color)
    

    筛选Filter

    filter()函数可以按给定的逻辑条件筛选出符合要求的子数据集.同时也可以根据行号筛选数据,语法为语法 filter(.data, ...)

    #筛选出height为150的行
    filter(starwars, height == 150)
    #筛选出sex为female的行
    filter(starwars, sex == 'female')
    #筛选出skin_color为light并且height等于150的行
    filter(starwars, skin_color == 'light' & height == 150)
    filter(starwars, skin_color == 'light',height == 150)
    #筛选出skin_color为light或者height等于150的行
    filter(starwars, skin_color == 'light' | height == 150)
    #过滤出height等于150或159的行
    filter(starwars, height %in% c(150, 165))
    
    #filter()函数和slice()函数根据行号筛选数据
    #选取第一行数据
    slice(starwars, 1L)
    filter(starwars, row_number() == 1L)
    #选取最后一行数据
    slice(starwars, n())
    filter(starwars, row_number() == n())
    #选取第5行到最后一行所有数据
    slice(starwars, 5:n())
    filter(starwars, between(row_number(), 5, n()))
    

    变形mutate

    mutate函数对已有列进行数据运算并添加为新列,同时还有另外一个函数transmute()只返回扩展的新变量。语法为mutate(.data, ...)transmute(.data, ...)

    # 添加两列:ht_m将身高数据除以100,color列连接skin_color和eye_color两列
    mutate(starwars, ht_m = height/100,color =paste(starwars$skin_color,starwars$eye_color,sep="_"))
    #计算新列wt_kg和wt_t,返回对象中只包含新列
    transmute(starwars, ht_m = height/100,color =paste(starwars$skin_color,starwars$eye_color,sep="_"))
    #添加新列,在同一语句中可以使用刚添加的列,注意这里不用添加dataframe名,否则会报错
    mutate(starwars, ht_m = height/100,ht_m_text =paste(ht_m,"m",sep="_"))
    

    抽样sample

    抽样函数,sample_n()随机抽取指定数目的样本,sample_frac()随机抽取指定百分比的样本,默认都为不放回抽样,通过设置replacement = TRUE可改为放回抽样,可以用于实现Bootstrap抽样。语法为sample_n(tbl, size, replace = FALSE, weight = NULL, .env = parent.frame())在新版本的dplyr包中抽样函数已变为slice_sample。

    #无放回抽样10行数据
    sample_n(starwars, 10)
    #有放回抽样20行数据
    sample_n(starwars, 20, replace = TRUE)
    #默认size=1,相当于对全部数据无放回抽样
    sample_frac(starwars)
    #无放回抽样10%的数据
    sample_frac(starwars, 0.1)
    
    # 按个数抽样
    slice_sample(starwars,n = 10)
    # 按比例抽样
    slice_sample(starwars,prop = 0.1)
    

    汇总summarise

    对数据框调用其它函数进行汇总操作, 返回一维的结果,返回多维结果时会报如下错误:Error: expecting result of length one, got : 2,语法为summarise(.data, ...)
    注意在使用统计函数时保证数据不存在缺失值,否则结果会返回NA,可以利用na.omit(starwars)来去抽除数据框中包含NA的行.

    #返回数据中height的均值
    summarise(na.omit(starwars), mean(height))
    #返回数据中height的标准差
    summarise(na.omit(starwars), sd(height))
    #返回数据中height的最大值及最小值
    summarise(na.omit(starwars), max(height), min(height))
    #返回数据框的行数
    summarise(starwars, n())
    #返回sex去重后的个数数
    summarise(starwars, n_distinct(sex))
    #返回height的第一个值
    summarise(starwars, first(height))
    #返回height的最后一个值
    summarise(starwars, last(height))
    

    分组group_by

    group_by()函数用于对数据集按照给定变量分组,返回分组后的数据集。对返回后的数据集使用以上介绍的函数时,会自动的对分组数据操作。

    #使用变量sex对starwars分组,返回分组后数据集,注意去除数据集中的NA
    sw_group <- group_by(na.omit(starwars), sex)
    #返回每个分组中最大height所在的行
    filter(sw_group, height == max(height))
    #返回每个分组中变量名包含d的列,同时始终返回列sex(上述分组依据列)
    select(sw_group, contains("d"))
    #使用height对每个分组排序
    arrange(sw_group,  height)
    #对每个分组无放回抽取2行
    sample_n(sw_group, 2)
    #求每个分组中height和birth_year的均值
    summarise(sw_group, mean(height), mean(birth_year))
    #返回每个分组中height第二的值
    summarise(sw_group, nth(height,2))
    
    
    #获取分组数据集所使用的分组变量
    groups(sw_group)
    #ungroup从数据框中移除组合信息,因此返回的分组变量为NULL
    groups(ungroup(sw_group))
    

    数据连接join

    数据框中经常需要将多个表进行连接操作, 如左连接、右连接、内连接等,dplyr包也提供了数据集的连接操作,类似于 base::merge() 函数。语法如下:

      #内连接,合并数据仅保留匹配的记录
      inner_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) 
    
      #左连接,向数据集x中加入匹配的数据集y记录
      left_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
    
      #右连接,向数据集y中加入匹配的数据集x记录
      right_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) 
    
      #全连接,合并数据保留所有记录,所有行
      full_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
    
      #返回能够与y表匹配的x表所有记录 
      semi_join(x,y, by = NULL, copy = FALSE, ...)
    
      #返回无法与y表匹配的x表的所有记录
      anti_join(x, y, by = NULL, copy = FALSE, ...) 
    

    by设置两个数据集用于匹配的字段名,默认使用全部同名字段进行匹配,如果两个数据集需要匹配的字段名不同,可以直接用等号指定匹配的字段名,如, by = c(“a” = “b”),表示用x.a和y.b进行匹配。如果两个数据集来自不同的数据源,copy设置为TRUE时,会把数据集y的数据复制到数据集x中,出于性能上的考虑,需要谨慎设置copy参数为TRUE。合并后的数据集中同名变量,会自动添加suffix中设置的后缀加以区分。

    df1 = data.frame(CustomerId=c(1:6), sex = c("f", "m", "f", "f", "m", "m"), Product=c(rep("Toaster",3), rep("Radio",3)))
    df2 = data.frame(CustomerId=c(2,4,6,7),sex = c( "m", "f", "m", "f"), State=c(rep("Alabama",3), rep("Ohio",1)))
    #内连接,默认使用"CustomerId"和"sex"连接
    inner_join(df1, df2)
    #左连接,默认使用"CustomerId"和"sex"连接
    left_join(df1, df2)
    #右连接,默认使用"CustomerId"和"sex"连接
    right_join(df1, df2)
    #全连接,默认使用"CustomerId"和"sex"连接
    full_join(df1, df2)
    #内连接,使用"CustomerId"连接,同名字段sex会自动添加后缀
    inner_join(df1, df2, by = c("CustomerId" = "CustomerId"))
    #以CustomerId连接,返回df1中与df2匹配的记录
    semi_join(df1, df2, by = c("CustomerId" = "CustomerId"))
    #以CustomerId和sex连接,返回df1中与df2不匹配的记录
    anti_join(df1, df2)
    

    dplyr包在R语言中也经常和tidyr包一起使用进行数据清洗,tidyr包的使用可以查看:http://smilecoc.vip/2021/09/03/R_tidyr/

    参考链接:
    https://blog.csdn.net/wltom1985/article/details/54973811
    https://zhuanlan.zhihu.com/p/150457098
    https://www.cnblogs.com/shangfr/p/6110614.html

    展开全文
  • dplyr包的用法

    2021-03-07 16:38:42
    面德勤的时候被要求用R的dplyr包处理数据(题做的不是很好所以被拒了orz),了解了一下发现和SQL的基础操作还蛮像,????上来供以后参考。
  • R语言包 dplyr之常用函数 欢迎关注公众号:统计与数据挖掘 一、安装 我的环境:win10 64位。R版本:4.0 以下所有操作均基于 jupyter lab+R语言。 install.packages(“dplyr”) 二、加载包 library(“dplyr”) 三...
  • 浅谈R利器之dplyr

    2020-07-05 22:17:46
    给大家逐一介绍R的几种利器包(package),如dplyr(数据处理神包)、ggplot2(画图神器)、shiny(网页开发神包)、rvest(网络数据爬取)、sp(地理数据分析包)等。也会给大家介绍R读取二进制、GRIB、NC等格式...
  • 最形象的Dplyr包函数讲解

    千次阅读 多人点赞 2019-06-14 15:12:48
    本文档对R语言中专注于数据预处理的Dplyr包做了一些简要介绍,演示了一些主要的函数及其功能。但要指出的是,还有相当大一部分函数操作的细节被忽略了。要彻底掌握Dplyr包的使用,必须在熟悉其函数功能框架的基础上...
  • 本篇内容主要介绍常用的数据导入函数和dplyr包中的一些重要函数。 1 数据导入 R支持多种数据格式,最常见的是csv和excel文件。 1.1 导入csv文件 read.table()和read.csv()是R基础包utils中的函数(基础包会自动加载...
  • dplyr工具包是tidyverse系列包的重要组成部分,功能是“数据操纵”,对标于基础包中的base包。前面已经介绍了该包用于数据预处理的主要函数和colwise/rowwise功能,本...
  • dplyr包官方文档翻译

    2019-02-24 22:50:45
    dplyr包官方文档翻译1. 最基本的函数小结2. 分组(Grouped)操作Grouped 操作分组对动词的影响如下:3. select 操作4. Mutating 操作5. group_by()6. _at()7. 管道操作符8. data table总结 dplyr包可以让以下操作...
  • R语言dplyr数据变换

    千次阅读 2021-02-24 12:55:54
    dplyr数据变换” 这一章主要介绍 filter():筛选 mutate():建立新的变量 group_by(): summarise(): %>%:管道操作 1.filter():筛选 第一个参数是数据框,后面的是逻辑值 例如 dplyr::filter(iris,Sepal....
  • benchm-dplyr-dt-源码

    2021-07-12 21:30:38
    dplyr 和 data.table 的简单/基本/有限/不完整基准 对于参数n = 10M, 100M和m = 100, 10K, 1M ,创建 data.frames d <- data.frame(x = sample(m, n, replace=TRUE), y = runif(n)) dm <- data.frame(x = ...
  • 教程-dplyr-en 客观的 tutorial-dplyr-es是西班牙语教程,用于: 学习如何使用dplyr ( R包) 理解动词和管道 与其他方法比较速度 在附录中,读者将了解数据是如何创建的。 程序 0. 了解dplyr和data.table是如何...
  • 接上篇!library(dplyr) 6 替换/重编码替换/重编码操作是对数据框中的部分元素进行改动。recode函数用于原子向量中的元素替换文本型元素的替换:txt<-c(LE...
  • dplyr包介绍学习

    千次阅读 2018-03-27 11:37:22
    dplyr包:plyr包的替代者,专门面对数据框,将ddplyr转变为更易用的接口%&gt;%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,...
  • R语言小白学习笔记7—高效的分组操作:dplyr笔记链接学习笔记7—高效的分组操作:dplyr7.1 管道和tbl数据类型7.2 select函数7.3 filter函数7.4 slice函数7.5 mutate函数7.6 summarize函数7.7 group_by函数7.8 ...
  • 12,在dplyr之前,R中比较流行的一个根据变量值来筛选数据的方程叫做subset(),其第一个方程是表格名称,第二个参数是行筛选,第三个参数是列筛选,如果没有第三个参数将显示所有的变量。 13,逻辑符号&表示且的关系...
  • 此文件夹包含有关 dplyr R 包和来自 magrittr R 包的管道函数的注释和练习,用于 2014 年 9 月 16 日的 stats-beerz 研讨会。 代码由肖恩·安德森 (Sean Anderson) 编写, sean "at" seananderson.ca 示例数据来自...
  • dplyr提供的case_when()函数简化多个if_else语句,如果不匹配返回NA。结合mutate函数可基于已有变量创建新的变量。本文通过几个示例进行对比学习。 语法: library(dplyr) # df %>% # mutate(new_var = case_...
  • dplyr包主要用于数据清洗和整理,主要功能有:行选择、列选择、统计汇总、窗口函数、数据框交集等是非常高效、友好的数据处理包,学清楚了,基本上数据能随意玩弄,对的,随意玩弄,简直大大提高数据处理及分析效率...
  • dplyr包30个实例

    千次阅读 2018-04-15 20:49:56
    dplyr软件包是R中功能最强大,最受欢迎的软件包之一。该软件包由最受欢迎的R程序员Hadley Wickham编写,他编写了许多有用的R软件包,如ggplot2,tidyr等。本文包括一些示例和如何使用使用dplyr软件包来清理和转换...
  • R软件包dplyr用于数据清理,处理,可视化和分析,包含了很多有用的功能,与ggplot2,reshape2并列为数据分析及可视化的三大包之一。 select() filter() mutate() group_by() summarise() arrange() jo.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,611
精华内容 2,244
关键字:

dplyr