R语言dplyr、tidyr使用笔记

来源:互联网 发布:手机里js文件怎么打开 编辑:程序博客网 时间:2024/06/03 21:31

目录

  • dplyr包
      • 1 展现数据 tbl_df
      • 2 筛选数据 filter
      • 3 排列数据 arrange
      • 4 选择子集 select
      • 5 变形 mutate
      • 6 总览数据 summarise
      • 7 数据分组 group_by
  • tidyr包
      • 1 宽转长 gather
      • 2 长转宽 spread
      • 3 合并 unit
      • 4 拆分 separate

1 dplyr包

1.1 展现数据 tbl_df()

函数tbl_df()使得大数据集规范显示出来,行列都只显示10个,跟head差不多,但是head只能控制行,无法控制列,使用tbl_df()就是为了防止数据刷屏。

> mtcars_df <- tbl_df(mtcars)> mtcars_df# A tibble: 32 × 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.0     6 160.0   110  3.90 2.620 16.46     0     1     4     42   21.0     6 160.0   110  3.90 2.875 17.02     0     1     4     43   22.8     4 108.0    93  3.85 2.320 18.61     1     1     4     14   21.4     6 258.0   110  3.08 3.215 19.44     1     0     3     15   18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     26   18.1     6 225.0   105  2.76 3.460 20.22     1     0     3     17   14.3     8 360.0   245  3.21 3.570 15.84     0     0     3     48   24.4     4 146.7    62  3.69 3.190 20.00     1     0     4     29   22.8     4 140.8    95  3.92 3.150 22.90     1     0     4     210  19.2     6 167.6   123  3.92 3.440 18.30     1     0     4     4# ... with 22 more rows

1.2 筛选数据 filter()

按给定的逻辑判断筛选出符合要求的子数据集

> filter(mtcars_df, mpg == 21, cyl == 6)# A tibble: 2 × 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.620 16.46     0     1     4     42    21     6   160   110   3.9 2.875 17.02     0     1     4     4

1.3 排列数据 arrange()

按给定的列名依次对行进行排序

# 先对cyl列正序排列,再对carb列倒序排列> print(arrange(mtcars_df, cyl, desc(carb)))    mpg cyl  disp  hp drat    wt  qsec vs am gear carb1  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    22  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    23  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    24  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    25  30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    26  21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    27  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    18  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    19  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    110 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    111 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    112 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    613 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    414 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    415 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    416 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    417 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    118 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    119 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    820 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    421 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    422 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    423 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    424 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    425 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    426 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    327 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    328 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    329 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    230 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    231 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    232 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2

1.4 选择子集 select()

用列名作参数来选择子数据集

> select(mtcars_df, mpg, disp:wt, carb) # disp:wt表示从disp列选到wt列# A tibble: 32 × 6     mpg  disp    hp  drat    wt  carb*  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>1   21.0 160.0   110  3.90 2.620     42   21.0 160.0   110  3.90 2.875     43   22.8 108.0    93  3.85 2.320     14   21.4 258.0   110  3.08 3.215     15   18.7 360.0   175  3.15 3.440     26   18.1 225.0   105  2.76 3.460     17   14.3 360.0   245  3.21 3.570     48   24.4 146.7    62  3.69 3.190     29   22.8 140.8    95  3.92 3.150     210  19.2 167.6   123  3.92 3.440     4# ... with 22 more rows

1.5 变形 mutate()

对已有列进行数据运算并添加为新列

> mutate(mtcars_df, NO = 1:dim(mtcars_df)[1], res = hp - drat)  # A tibble: 32 × 13     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb    NO    res   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>  <dbl>1   21.0     6 160.0   110  3.90 2.620 16.46     0     1     4     4     1 106.102   21.0     6 160.0   110  3.90 2.875 17.02     0     1     4     4     2 106.103   22.8     4 108.0    93  3.85 2.320 18.61     1     1     4     1     3  89.154   21.4     6 258.0   110  3.08 3.215 19.44     1     0     3     1     4 106.925   18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     2     5 171.856   18.1     6 225.0   105  2.76 3.460 20.22     1     0     3     1     6 102.247   14.3     8 360.0   245  3.21 3.570 15.84     0     0     3     4     7 241.798   24.4     4 146.7    62  3.69 3.190 20.00     1     0     4     2     8  58.319   22.8     4 140.8    95  3.92 3.150 22.90     1     0     4     2     9  91.0810  19.2     6 167.6   123  3.92 3.440 18.30     1     0     4     4    10 119.08# ... with 22 more rows

1.6 总览数据 summarise()

对数据框调用其它函数进行汇总操作, 返回一维的结果

> summarise(mtcars_df, mdisp = mean(disp, na.rm = TRUE), mhp = mean(hp, na.rm = TRUE))# A tibble: 1 × 2     mdisp      mhp     <dbl>    <dbl>1 230.7219 146.6875

1.7 数据分组 group_by()

当对数据集通过group_by()添加了分组信息后,mutate(),arrange() 和 summarise() 函数会自动对这些 tbl 类数据执行分组操作。

> cars <- group_by(mtcars_df, cyl)> (countcars <- summarise(cars, count = n())) # count = n()用来计算次数# A tibble: 3 × 2    cyl count  <dbl> <int>1     4    112     6     73     8    14

2 tidyr包

2.1 宽转长 gather()

使用gather()函数实现宽表转长表,语法如下:

# gather(data, key, value, …, na.rm = FALSE, convert = FALSE)# data:需要被转换的宽形表# key:将原数据框中的所有列赋给一个新变量key# value:将原数据框中的所有值赋给一个新变量value# …:可以指定哪些列聚到同一列中# na.rm:是否删除缺失值> (longdata <- gather(mtcars_df, attribute, value, -mpg))# A tibble: 320 × 3     mpg attribute value   <dbl>     <chr> <dbl>1   21.0       cyl     62   21.0       cyl     63   22.8       cyl     44   21.4       cyl     65   18.7       cyl     86   18.1       cyl     67   14.3       cyl     88   24.4       cyl     49   22.8       cyl     410  19.2       cyl     6# ... with 310 more rows> (longdata <- gather(mtcars_df, attribute, value))# A tibble: 352 × 2   attribute value       <chr> <dbl>1        mpg  21.02        mpg  21.03        mpg  22.84        mpg  21.45        mpg  18.76        mpg  18.17        mpg  14.38        mpg  24.49        mpg  22.810       mpg  19.2# ... with 342 more rows> (longdata <- gather(mtcars_df, attribute, value, mpg, carb))# A tibble: 64 × 11     cyl  disp    hp  drat    wt  qsec    vs    am  gear attribute value   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>     <chr> <dbl>1      6 160.0   110  3.90 2.620 16.46     0     1     4       mpg  21.02      6 160.0   110  3.90 2.875 17.02     0     1     4       mpg  21.03      4 108.0    93  3.85 2.320 18.61     1     1     4       mpg  22.84      6 258.0   110  3.08 3.215 19.44     1     0     3       mpg  21.45      8 360.0   175  3.15 3.440 17.02     0     0     3       mpg  18.76      6 225.0   105  2.76 3.460 20.22     1     0     3       mpg  18.17      8 360.0   245  3.21 3.570 15.84     0     0     3       mpg  14.38      4 146.7    62  3.69 3.190 20.00     1     0     4       mpg  24.49      4 140.8    95  3.92 3.150 22.90     1     0     4       mpg  22.810     6 167.6   123  3.92 3.440 18.30     1     0     4       mpg  19.2# ... with 54 more rows

2.2 长转宽 spread()

有时,为了满足建模或绘图的要求,往往需要将长形表转换为宽形表,或将宽形表变为长形表。如何实现这两种数据表类型的转换。使用spread()函数实现长表转宽表,语法如下:

# spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)# data:为需要转换的长形表# key:需要将变量值拓展为字段的变量# value:需要分散的值# fill:对于缺失值,可将fill的值赋值给被转型后的缺失值> spread(longdata, attribute, value)# A tibble: 32 × 11     cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb   mpg*  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>1      4  71.1    65  4.22 1.835 19.90     1     1     4     1  33.92      4  75.7    52  4.93 1.615 18.52     1     1     4     2  30.43      4  78.7    66  4.08 2.200 19.47     1     1     4     1  32.44      4  79.0    66  4.08 1.935 18.90     1     1     4     1  27.35      4  95.1   113  3.77 1.513 16.90     1     1     5     2  30.46      4 108.0    93  3.85 2.320 18.61     1     1     4     1  22.87      4 120.1    97  3.70 2.465 20.01     1     0     3     1  21.58      4 120.3    91  4.43 2.140 16.70     0     1     5     2  26.09      4 121.0   109  4.11 2.780 18.60     1     1     4     2  21.410     4 140.8    95  3.92 3.150 22.90     1     0     4     2  22.8# ... with 22 more rows

2.3 合并 unit()

unite的调用格式如下

# unite(data, col, …, sep = “_”, remove = TRUE)# data:为数据框# col:被组合的新列名称# …:指定哪些列需要被组合# sep:组合列之间的连接符,默认为下划线# remove:是否删除被组合的列> TIMES <- data.frame(years = c('1990', '1991', '1992'), months = c(2,3,4), day = c(1, 2, 3))> (TIMESunite <- unite(TIMES, information, months, day, sep= "-"))  years information1  1990         2-12  1991         3-23  1992         4-3

2.4 拆分 separate()

separate()函数可将一列拆分为多列,一般可用于日志数据或日期时间型数据的拆分,语法如下

# separate(data, col, into, sep = “[^[:alnum:]]+”, remove = TRUE,# convert = FALSE, extra = “warn”, fill = “warn”, …)# data:为数据框# col:需要被拆分的列# into:新建的列名,为字符串向量# sep:被拆分列的分隔符# remove:是否删除被分割的列> (TIMESsep <- separate(TIMESunite, information, c("months", "day"), sep = "-"))  years months day1  1990      2   12  1991      3   23  1992      4   3
0 0