R语言常用的数据处理的包(1)

在R中有很多的内置函数,比如transform()、rbind()、cbind()等函数,这些函数我们可以直接使用,除此之外,还有常见的几种包在处理数据的时候非常好用。

dplyr包

dplyr包是Hadley Wickham(ggplot2包的作者,被称为‘一个改变R的人’)的杰作, dplyr可用于处理R内部或者外部的结构化数据,相较于plyr包,dplyr专注接受dataframe对象, 大幅提高了速度,并且提供了更稳健的数据库接口。

一、筛选: filter系列

filter、filter_all、filter_at、filter_if
用法:filter(.data, 条件...)
这里我们用R的内置数据集作为例子(mtcars)

    filter(mtcars, cyl == 8)  
    filter(mtcars, cyl < 6)  
    #过滤出cyl < 6 并且 vs == 1的行  

    filter(mtcars, cyl < 6 & vs == 1)  
    filter(mtcars, cyl < 6, vs == 1)  
    #过滤出cyl < 6 或者 vs == 1的行  
    filter(mtcars, cyl < 6 | vs == 1)  
    #过滤出cyl 为4或6的行  
    filter(mtcars, cyl %in% c(4, 6))  

基于filter函数的用法,扩展出了一些新的函数

1filter_all(mtcars, any_vars(. > 150)) #筛选任何变量>150的样本
2filter_at(mtcars, vars(starts_with("d")), any_vars((. %% 2) == 0)) 
3#筛选变量以“d”结尾,并且变量 "%%2" 等于0
4filter_if(mtcars, ~ all(floor(.) == .), all_vars(. != 0))
5# 筛选变量向下取整 == 原变量数值, 并且这部分变量的数值!= 0 的样本集
二、slice函数

用法:slice(.data, ...)
用处: slice() 函数通过行号选取数据

#选取第一行的数据
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

用法:arrange(.data, ...)
arrange()按给定的列名依次对行进行排序,默认是按照升序排序,对列名加 desc() 可实现倒序排序。原数据集行名称会被过滤掉

#以cyl和disp联合升序排序 ,如果cyl相同,按照disp 
  arrange(mtcars, cyl, disp)  
#以disp降序排序  
  arrange(mtcars, desc(disp))  
四、选择: select

用法:select(.data, ...)

#选取变量名前缀包含Petal的列  
select(iris, starts_with("Petal"))  
#选取变量名前缀不包含Petal的列  
select(iris, -starts_with("Petal"))  
#选取变量名后缀包含Width的列  
select(iris, ends_with("Width"))  
#选取变量名后缀不包含Width的列  
select(iris, -ends_with("Width"))  
#选取变量名中包含etal的列  
select(iris, contains("etal"))  
#选取变量名中不包含etal的列  
select(iris, -contains("etal"))  
#正则表达式匹配,返回变量名中包含t的列  
select(iris, matches(".t."))  
#正则表达式匹配,返回变量名中不包含t的列  
select(iris, -matches(".t."))  
#直接选取列  
select(iris, Petal.Length, Petal.Width)  
#返回除Petal.Length和Petal.Width之外的所有列  
select(iris, -Petal.Length, -Petal.Width)  
#使用冒号连接列名,选择多个列  
select(iris, Sepal.Length:Petal.Width)  
#选择字符向量中的列,select中不能直接使用字符向量筛选,需要使用one_of函数  
vars <- c("Petal.Length", "Petal.Width")  
select(iris, one_of(vars))  
#返回指定字符向量之外的列  
select(iris, -one_of(vars))  
#返回所有列,一般调整数据集中变量顺序时使用  
select(iris, everything())  
#调整列顺序,把Species列放到最前面  
select(iris, Species, everything()) 

一般我们用select函数选择一个数据的几列

    df <- as.data.frame(matrix(runif(100), nrow = 10))  
    df <- tbl_df(df[c(3, 4, 7, 1, 9, 8, 5, 2, 6, 10)])  
    #选择V4,V5,V6三列  
    select(df, V4:V6)  
    select(df, num_range("V", 4:6))  
五、变形: mutate

用法:mutate(.data, ...)
mutate()函数对已有列进行数据运算并添加为新列,

    #添加新列wt_kg和wt_t,在同一语句中可以使用刚添加的列  
    mutate(mtcars, wt_kg = wt * 453.592, wt_t = wt_kg / 1000)  
    #计算新列wt_kg和wt_t,返回对象中只包含新列  
    transmute(mtcars, wt_kg = wt * 453.592, wt_t = wt_kg / 1000)  
六、分组: group

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

    #使用变量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)  
七、数据关联:join

类似于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, ...) 

当然,dplyr不止这一种用法,希望各位道友一起补充,丰富我们的数据数据经验和生信分析的工作。

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

推荐阅读更多精彩内容