前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「R」dplyr 包使用

「R」dplyr 包使用

作者头像
王诗翔呀
发布2020-07-03 12:49:07
1.1K0
发布2020-07-03 12:49:07
举报
文章被收录于专栏:优雅R

管道操作

主要目的是减少不必要的中间变量x %>% f(y)其实是f(x, y)

代码语言:javascript
复制
by_species <- iris %>%  
     group_by(Species)
summary的用法

summary()函数会对 进行处理,并且 创建新的列表 ,简单来说就是把向量作为输入值,输出单个数值。

  • summarise(.data, ...)
代码语言:javascript
复制
> summarise(mtcars, avg = mean(mpg))
       avg
1 20.09062

⚠️:当summarise的时候,想要用到原来的列名,又想要继续对列处理,记得加``符号把列名括住,比如:

代码语言:javascript
复制
summarise(`Sig1` = mean(Sig1),
            `Sig2` = mean(Sig2),
            `Sig3` = mean(Sig3),
            `Sig4` = mean(Sig4),
            `Sig5` = mean(Sig5),
            `Sig6` = mean(Sig6))
  • count(x, ..., wt = NULL, sort = FALSE)按照...这个列内容是否相同的进行分组,计算同一组有多少

参数: x:数据 ...:根据哪列对数据进行分组 wt: sort:

代码语言:javascript
复制
> count(iris, Species)
# A tibble: 3 x 2
  Species        n
  <fct>      <int>
1 setosa        50
2 versicolor    50
3 virginica     50
  • summarise_all(.tbl, .funs, enquo(.funs), caller_env(), ...)对所有列进行function处理
  • summarise_at()对特定的列进行function处理
  • summarise_if()对所有属于一个类型的列进行处理
group的用法
  • group_by(.data, ..., add = FALSE)根据...对数据进行分组后返回,不会保存成新数据,需要另外赋值

参数:add = FALSE 原始数据基础上加新的分类

  • ungroup(x, ...)分组后,返回没有分组的数据,除去之前的分组(不是必须的操作)
基本操作

对行的基本操作

  • filter(.data, ...)筛选出符合...的数据
  • distinct(.data, ..., .keep_all = FALSE)根据...查看不重复的数据

参数:.keep_all TRUE表示保留其他列,FALSE表示仅保留这一列

代码语言:javascript
复制
> distinct(iris, Species, .keep_all = FALSE)
     Species
1     setosa
2 versicolor
3  virginica

> distinct(iris, Species, .keep_all = TRUE)
  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1          5.1         3.5          1.4         0.2     setosa
2          7.0         3.2          4.7         1.4 versicolor
3          6.3         3.3          6.0         2.5  virginica
  • slice(.data, ...)根据具体位置选
代码语言:javascript
复制
> slice(iris, 10:15)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          4.9         3.1          1.5         0.1  setosa
2          5.4         3.7          1.5         0.2  setosa
3          4.8         3.4          1.6         0.2  setosa
4          4.8         3.0          1.4         0.1  setosa
5          4.3         3.0          1.1         0.1  setosa
6          5.8         4.0          1.2         0.2  setosa
  • arrange(.data, ...)根据列的内容对 进行升序排列,加上desc()就是降序
代码语言:javascript
复制
arrange(mtcars, mpg) %>% head()
arrange(mtcars, desc(mpg)) %>% head()
  • add_row(.data, ..., .before = NULL, .after = NULL)增加一行或多行 举例:增加eruptions值是1,waiting值是1的一行
代码语言:javascript
复制
add_row(faithful, eruptions = 1, waiting = 1)
操作变量
  • pull(,data, var = -1)提取数据框中某列内容出来
代码语言:javascript
复制
> pull(iris, Sepal.Length)
  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7
 [20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9
 [39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3
 [58] 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6
 [77] 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6
 [96] 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7
[115] 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4
[134] 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9
  • select(.data, ...)根据各种条件在数据框中提取数据 举例:
代码语言:javascript
复制
> select(iris, Sepal.Length, Species)
    Sepal.Length    Species
1            5.1     setosa
2            4.9     setosa
3            4.7     setosa
  • mutate(.data, ...)生成新列
代码语言:javascript
复制
> mutate(mtcars, gpm = 1/mpg)
    mpg cyl  disp  hp drat    wt  qsec vs am gear carb        gpm
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4 0.04761905
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4 0.04761905
3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1 0.04385965
  • transmute(.data, ...)只显示新生成的列
代码语言:javascript
复制
> transmute(mtcars, gpm = 1/mpg)
          gpm
1  0.04761905
2  0.04761905
3  0.04385965
  • mutate_all(.tbl, .funs, ...).funs函数应用到数据框的每列
代码语言:javascript
复制
> faithful
    eruptions waiting
1       3.600      79
2       1.800      54
3       3.333      74
代码语言:javascript
复制
> mutate_all(faithful, funs(log(.), log2(.)))
    eruptions waiting eruptions_log waiting_log eruptions_log2 waiting_log2
1       3.600      79     1.2809338    4.369448      1.8479969     6.303781
2       1.800      54     0.5877867    3.988984      0.8479969     5.754888
3       3.333      74     1.2038728    4.304065      1.7368213     6.209453
  • mutate_if(data, 判断条件, funtion)
代码语言:javascript
复制
> mutate_if(iris, is.numeric, funs(log(.)))
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1       1.629241   1.2527630   0.33647224 -1.60943791     setosa
2       1.589235   1.0986123   0.33647224 -1.60943791     setosa
3       1.547563   1.1631508   0.26236426 -1.60943791     setosa
  • mutate_at(.tbl, .cols, .funs, ...)把函数应用到数据框指定的列 举例:vars(-Species)表示除了这列,对其他的进行运算
代码语言:javascript
复制
> mutate_at(iris, vars(-Species), funs(log(.)))
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1       1.629241   1.2527630   0.33647224 -1.60943791     setosa
2       1.589235   1.0986123   0.33647224 -1.60943791     setosa
3       1.547563   1.1631508   0.26236426 -1.60943791     setosa
  • add_column(.data, ..., .before = NULL, .after = NULL)增加新的一列 举例:
代码语言:javascript
复制
> add_column(mtcars, new = 1:32)
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb new
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4   1
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4   2
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1   3
  • rename(.data, 新名 = 旧名)对列重命名
代码语言:javascript
复制
> rename(iris, Length = Sepal.Length)
    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
处理行名
  • rownames_to_column()把行名变成第一列的内容

举例:

代码语言:javascript
复制
> a <- rownames_to_column(iris, var = "C")
> head(a)
  C Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 1          5.1         3.5          1.4         0.2  setosa
2 2          4.9         3.0          1.4         0.2  setosa
3 3          4.7         3.2          1.3         0.2  setosa
4 4          4.6         3.1          1.5         0.2  setosa
5 5          5.0         3.6          1.4         0.2  setosa
6 6          5.4         3.9          1.7         0.4  setosa
  • column_to_rownames()把第一列作为行名

举例: 注意,把列的内容转换成行名的时候,该列的内容不能够存在重复

代码语言:javascript
复制
> b <- column_to_rownames(iris, var = "Species")
Error in `.rowNamesDF<-`(x, value = value) : 
  duplicate 'row.names' are not allowed
In addition: Warning message:
non-unique values when setting 'row.names': ‘setosa’, ‘versicolor’, ‘virginica’ 
> b <- column_to_rownames(a, var = "C")
> b
    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

根据列整合数据框

  • bind_cols()把两个数据框合并,两个数据框的行数要一致
代码语言:javascript
复制
> d1 <- data.frame(1:2) 
> d1
  X1.2
1    1
2    2
> d2 <- data.frame(1:3) 
> d2
  X1.3
1    1
2    2
3    3
> bind_cols(d1,d2)
Error: Argument 2 must be length 2, not 3
  • left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)把数据框y中和x匹配上的进行整合

⚠️by = c("col1", "col2", "col3", ...)举例:left_join(x, y, by = "A")

⚠️:by = c("col1" = "col2")举例:left_join(x, y, by = c("C" = "D"))把y数据框中D列的内容当作索引,把y根据索引C去匹配x数据框中D中的内容,匹配上就把y中其他列的内容根据索引组合上去。

⚠️:suffix两个数据框中有相同名称的列,即使不匹配也保留相同的名称 举例:left_join(x, y, by = c("C" = "D"), suffix = c("1", "2"))

  • right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
  • inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
  • full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
按行整合数据框
bind_rows
bind_rows
  • bind_rows(..., id = NULL)
  • id是增加的新列的名字
  • intersect(x, y, ...)取得同时出现在x和y两个数据框中的行
  • setdiff(x, y, ...)出现在x中但是不在y中的行
  • union(x, y, ...)整合出现在x数据框中或y数据框中的,去除了两个数据框中重复的部分,想要保留重复的话使用union_all()
  • setequal()测试两个数据集是不是包含了完全相同的两行
  • semi_join(x, y, by = NULL, ...)返回x数据集中能够匹配到y数据集中的行
  • anti_join(x, y, by = NULL)返回x数据集中不能够匹配到y数据集中的行
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 优雅R 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • summary的用法
  • group的用法
  • 基本操作
  • 操作变量
  • 处理行名
  • 按行整合数据框
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档