美文网首页
R包dplyr——数据处理必备神器

R包dplyr——数据处理必备神器

作者: 重拾生活信心 | 来源:发表于2022-12-25 14:21 被阅读0次
    • %>% 管道符

      传递变量,简洁代码

      • 用法:df %>% select(mpg,wt)->df1,运行一下,看看是不是选择了 df 中的,mpg,wt 两列呢,并且我们将结果赋值给了变量 df1
      • 作用 1:将 df,传递到 select 函数中的第一个位置,事实上,我们还可以通过"."作为占位符,来将 df 放到任意位置。
        比如df%>%select(mpg,wt,.) ,注意看,wt 后面有一个点,当然这条语句是不能正常运行的,我只是想告诉大家,通过“点”作为占位符,可以将上一个结果,放到下一个管道中的任意位置。
      • 作用 2:有没有发现用了管道符之后,我们再次使用列名 mpg 的时候,便不需要使用 df$mpg 了呢,没错,它的另外一个功能就是类似于 attach,数据绑定的功能,使用管道符,能让我们的代码更加简洁。
    • select() 筛选列

    用列名进行筛选。

    • 巧用以下符号
      • ":"该符号表示用于选择一系列的变量。
      • "!":表示取反操作的,类似于在 df 中不选择某列,比如 df[,-1],表示不选择第一列
      • "&":表示逻辑运算符“与”,表示“且”的意思。A&B,表示满足条件 A,且满足条件 B
      • "|":表示逻辑运算符“或”,表示“或”的意思。A|B,表示满足条件 A 或者满足条件 B 就可以了,通常具有短路操作。
      • "c()":就是表示列的组合,其实就是向量,元素可为数字或者字符串。
      • "-" :去除
    • 下面还有几个比较重要的函数,可以作为 select 选择列的参数来使用。
      • last_col() : 表示选择最后一列。
      • starts_with():表示以什么开头的列。
      • ends_with():表示以什么结尾的列。
      • contains():表示某列是否包含什么内容。
      • one_of():选择字符向量中的列,select中不能直接使用字符向量筛选,需要使用one_of函数.
      • everything:一般用于调整列顺序,把a列放到最前面
        select(iris, a, everything())
    • 例子:
      • 选择 df 中的第一列到第五列。
        用法:select(df,1:5)或者select(df,c(1,2,3,4,5))
      • 选择 df 中的 mpg wt 之间的所有列,包括(mpg,wt)
        用法:select(df,"mpg":"wt")
      • 选择某些列以"d"开头,或者以"p"结尾的。
        用法:select(df,starts_with("d")|ends_with("p"))
      • 选择某些列以"d"开头,且以"t"结尾的。
        用法:select(df,starts_with("d")&ends_with("t"))
      • 选择以"d"开头,且包含"s"的列。
        用法:select(df,starts_with("d")&contains("s"))
      • 选择以"d"开头,且以"p"结尾的列.
        用法:select(df,!(starts_with("d"))&(ends_with("p")))
      • 选择向量里的字符串变量名 :vars <- c("A", "B") select(iris, one_of(vars))
      • 返回指定字符向量之外的列 "-" :
        select(iris, - one_of(vars))

    • rename() 重命名 给定列

    保留所有的列,只对给定的列重新命名。原数据集行名称会被过滤掉。

    rename(data,new_name= old_name)

    #重命名列Petal.Length,返回子数据集只包含重命名的列
    select(iris, petal_length = Petal.Length)
    #重命名所有以Petal为前缀的列,返回子数据集只包含重命名的列
    select(iris, petal = starts_with("Petal"))
    #重命名列Petal.Length,返回全部列
    rename(iris, petal_length = Petal.Length)
    

    • filter() / slice() 筛选行

    • slice() 函数通过行号选取数据。
    • filter() 通过逻辑运算筛选。
      • ==, >, >= etc
      • &, |, !, xor()
      • is.na()
      • between(), near()
        • between(x,a,b):假设 x 是一个数值型向量,该函数判断 x 中元素是否(>=a)&(<=b),返回一个逻辑型向量。
    • 例子:
      - 选择 df 中,hp 列大于等于 110,小于等于 150 的行,且 gear 列等于 4。filter(df,between(df$hp,110,150)&(df["gear"]==4))
      - 选择 df 中,hp 列大于 disp 列的行。
      filter(df,df["hp"]>df["disp"])
      #选取第一行数据
    slice(mtcars, 1L)
    filter(mtcars, row_number() == 1L)
    #选取最后一行数据
    slice(mtcars, n())
    filter(mtcars, row_number() == n())
    #选取第5行到最后一行所有数据
    slice(mtcars, 5:n())
    filter(mtcars, between(row_number(), 5, n()))
    
    
    • arrange()排序

      默认是升序,如需降序,则使用 desc()函数。
      • 使 df 按照 mpg 列升序排列,wt 列,升序排列。
        arrange(df,"mpg","wt")
      • 使 df 按照 mpg 列升序排列,wt 列,降序排列。
        arrange(df,"mpg",desc("wt"))

    • mutate () 列计算/变形

    mutate():产生新的列,保留旧的列。
    新变量名 ,计算并赋值给变量名

    transmute()只返回扩展的新变量。原数据集行名称会被过滤掉。

        df%>%
        select(cyl,gear,wt)%>%
        mutate(cyl2=cyl*2,gear4=gear*4,
                        wt=NULL #将值设置为NULL,可将这列删除
                        )%>%
        head()
        ##cyl 和 gear 还在
        ## 新增列的位置:.before | .after
        #假如想指定这些新增加的列放在哪个列之前或者之后,使用 .before=原来df中的某个列名,可以将新增加列,放在原来的那个列名前面,注意before参数前面有个点!!,.after表示放在某个列之后。
    

    • summarise()对数据框或者分组变量进行统计性描述。

    常用结合函数

    • Center: mean(),median()
    • Spread:sd(), IQR() , mad()
    • Range:min() ,max(), quantile()
    • Position: first(), last(), nth()
    • Count: n() ,n_distinct()
    • Logical :any() ,all()
    • quantile():- 默认返回四分位(0,0.25(Q1),0.5(Q2),0.75(Q3),1)

      • quantile(1:10,c(0.25,0.75))#第二个参数控制 分位值
    • IQR () : 四分位间距

      • IQR(1:10 ) >IQR =Q3-Q1 =7.75-3.25=4.5
    • median():中位数 Q2

    • nth( ) : 表示抽取向量中哪一个位置的元素

      • 比如 nth(c(1,5,2),2)抽取的是第二个位置的,返回 5,还可以通过负号,来表示抽取倒数第几个,比如 nth(c(1,5,2),-3),表示抽取倒数第三个,就是 1
    • n( ):
      - 返回当前分组或者变量的信息,通常是计数,通常用在特定函数,比如 summarize,mutate 中。

    • n_distinct() : 去重后,再计数。

    • first(),last():
      - 参数可以为一个向量,分别返回向量的第一个值,和最后一个值。

    • mad() : 中位数绝对偏差


    • group_by() 对数据框按照一列或者多列进行分组

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

    group_by() 后,数据外观不变。(与 summarize()联用,分组统计描述。)

    #使用变量cyl对mtcars分组,返回分组后数据集
    by_cyl <- group_by(mtcars, cyl)
    #返回每个分组中最大disp所在的行
    filter(by_cyl, disp == max(disp))
    #返回每个分组中变量名包含d的列,始终返回分组列cyl
    select(by_cyl, contains("d"))
    #使用mpg对每个分组排序
    arrange(by_cyl,  mpg)
    #对每个分组无重复的取2行记录
    sample_n(by_cyl, 2)
    
    
    
    #使用变量cyl对mtcars分组,然后对分组后数据集使用聚合函数
    by_cyl <- group_by(mtcars, cyl)
    #返回每个分组的记录数
    summarise(by_cyl, n())
    #求每个分组中disp和hp的均值
    summarise(by_cyl, mean(disp), mean(hp))
    #返回每个分组中唯一的gear的值
    summarise(by_cyl, n_distinct(gear))
    #返回每个分组第一个和最后一个disp值
    summarise(by_cyl, first(disp))
    summarise(by_cyl, last(disp))
    #返回每个分组中最小的disp值
    summarise(by_cyl, min(disp))
    summarise(arrange(by_cyl,  disp), min(disp))
    #返回每个分组中最大的disp值
    summarise(by_cyl, max(disp))
    summarise(arrange(by_cyl,  disp), max(disp))
    #返回每个分组中disp第二个值
    summarise(by_cyl, nth(disp,2))
    
    #使用cyl对数据框分组
    grouped <- group_by(mtcars, cyl)
    #获取分组数据集所使用的分组变量
    groups(grouped)
    #ungroup从数据框中移除组合信息,因此返回的分组变量为NULL
    groups(ungroup(grouped))
    
    
    ##计数:
    group_size用于返回每个分组的记录数,n_groups返回分成的组数。
     对数据集的每个分组计数,类似于base:: table()函数。其中count已经过group_by分组,而tally需要对数据集调用group_by后对分组数据计数。
    
    tally(x, wt, sort = FALSE)
    count(x, ..., wt =NULL, sort = FALSE)
    #使用count对分组计数,数据已按变量分组
    count(mtcars, cyl)
    #设置sort=TRUE,对分组计数按降序排序
    count(mtcars, cyl, sort = TRUE)
    #使用tally对分组计数,需要使用group_by分组
    tally(group_by(mtcars, cyl))
    #使用summarise对分组计数
    summarise(group_by(mtcars, cyl), n())
    

    版权声明:本文为CSDN博主「Kingsley_W」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/wltom1985/article/details/54973811

    • sample_n ():从给定的数据框中,采样 n 个数据。
      sample_n(数据,采样个数,replace=FALSE | TRUE)
      • replace 表示是否放回抽样,默认为 FALSE,不放回抽样,如果需要放回抽样,则需要设置为 replace=TRUE
    • sample_frac ():从给定的数据框中,采样多少比例的数据。
      sample_frac(df,0.5,replace=FALSE) 从 df 中,采样 50%的数据。
    • case_when ( ) :针对向量元素,对符合条件的,做操作。
      1.当向量中的元素不符合条件时候,会被当做 NA,你操作的向量元素个数,和 case_when 输出的向量元素个数相等。
      2.每个条件的执行是有顺序的,顺序从上往下执行!
      3.输出的向量的类型必须是统一的,要么为数值型向量,要么为字符型向量,是什么类型取决于最上面执行的条件判断。
      4.当进行两个向量间的条件判断的时候,两个向量的元素个数必须相等
      格式为:case_when(条件 1~针对条件 1 进行的操作,TRUE~某操作)
      其中,符号"~"可理解为赋值操作。TRUE 可理解为 else,注意 else 的范围是最大的,如果放在第一行,并且进行的是赋值操作,那么就会返回你赋的值,如果是针对向量元素的操作,那么返回的还是一个向量。见下图。
      • if_else ( ):对向量进行条件筛选,然后操作。
        • if_else(条件,满足条件的元素的操作,不满足条件的元素的操作)
    • 集合操作:

      • union():并集去重
      • union_all( ) : 并集不去重
      • intersect : 交集
      • setdiff():差集
      • setdiff(a,b)a 中哪些在 b 中没有
      • setequal() : 判断是否相等
    • distinct():数据框去重。

      distinct(df,变量名 1,变量名 2,.keep_all=FALSE)
      默认使用所有变量去重,除非指定变量。
      ‘ .keep_all ’ :去重后是否保留所有变量。(FALSE,则只保留指定用于去重的变量)
    • 数据框连接:inner_join, left_join, right_join, full_join,anti_join,semi_join

    reference:
    R 语言中 dplyr 包 join 函数之目前我看到过的最形象的教程 - 简书 (jianshu.com)

    GitHub - gadenbuie/tidyexplain: 🤹♀ Animations of tidyverse verbs using R, the tidyverse, and gganimate

    image image
    • 内连接 inner_join 函数

      • 内连接的结果是一个新数据框,其中包含键、 x 值和 y 值。我们使用 by 参数告诉 dplyr 哪个变量是键:
    • 外连接

      • 内连接保留同时存在于两个表中的观测, 外连接则保留至少存在于一个表中的观测。外连接有 3 种类型。

      • 左连接:保留 x 中的所有观测。

      • 右连接:保留 y 中的所有观测

      • 全连接:保留 x 和 y 中的所有观测。

    • 筛选连接

      • semi_join(x, y): 保留 x 表中与 y 表中的观测相匹配的所有观测。
      • anti_join(x, y): 丢弃 x 表中与 y 表中的观测相匹配的所有观测。
    • 数据框合并:

    合并的对象为数据框,也可以是能够转换为数据框的列表。

    • 按行合并函数bind_rows()通过列名进行匹配,不匹配的值使用NA替代,类似于base:: rbind()函数。
    • 按列合并函数bind_cols()通过行号匹配,因此合并的数据框必须有相同的行数,函数类似于base:: cbind()函数。原数据集行名称会被过滤掉。语法如下:
      #按行合并,.id添加新列用于指明合并后每条数据来自的源数据框
    
      bind_rows(...,.id = NULL)
    
      #按列合并
    
      bind_cols(...)
    
      #合并数据集
    
       combine(...)
    

    Reference :
    https://blog.csdn.net/wltom1985/article/details/54973811
    https://zhuanlan.zhihu.com/p/358167377

    相关文章

      网友评论

          本文标题:R包dplyr——数据处理必备神器

          本文链接:https://www.haomeiwen.com/subject/abkgqdtx.html