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

  • %>% 管道符

    传递变量,简洁代码

    • 用法: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

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

推荐阅读更多精彩内容