R语言笔记Day1(六 tidyr)

1、tidyr包的下述四个函数用法:

  • 1)gather—宽数据转为长数据;
  • 2)spread—长数据转为宽数据;
  • 3)unit—多列合并为一列;
  • 4)separate—将一列拆分为多列。
1.1 安装和载入tidyr包
install.packages("tidyr")
library(tidyr)

1.2 新建数据框用来演示

> a<-data.frame(GeneId = rep("gene5",times=3), #rep重复 gene5重复3次
+               SampleName =paste("Sample",1:3,sep=""),
#或者paste0("Sample",1:3)###paste连接两个字符串,分隔符是'''',无空格
+               Expression=c(14,19,18))
> a
  GeneId SampleName Expression
1  gene5    Sample1         14
2  gene5    Sample2         19
3  gene5    Sample3         18

1.3 Tidy Data

R将清洁数据定义为:每个变量的数据存储在自身的列中,每个观测值的数据存储在其自身的行中。整洁数据是进行数据再加工的基础。

得到清洁数据,是为了实现

(1)数据框的变形
(2)数据框中的空值NA的补齐或删除
(3)长表与宽表的互换
(4)实现行或列的分割和合并

2.1 gather() 宽数据变长数据

gather(data,key="“,value=”",…, na.rm = FALSE) ## key是变量,value是值
gather的意义是重新塑造数据的变量,原有数据的变量并不是真正的变量

  • gather的变量指定其中,- 表示除外某向量,其余全部gather
参数 参数名称 说明
参数1 data 需要被转化的宽形表
参数2 key变量名 将原数据框中的变量名赋值给一个新变量key=""
参数3 value变量名 将原数据框中的所有值赋给一个新变量value=""
参数4 表示指定哪些列聚到同一列中
参数5 na.rm 是否删除缺失值
//创建一个新的数据框练习tidyr包
> geneid <- c("gene1","gene2","gene3","gene4")
> sample1 <- c(1,4,7,10)
> sample2 <- c(2,5,0.8,11)
> sample3 <- c(3,6,9,12)
> sample4 <- c(1,3,2,15)
> sample5 <- c(2,4,6,8)
> resach1 <- data.frame(geneid,sample1,sample2,sample3,sample4,sample5)
> resach1
  geneid sample1 sample2 sample3 sample4 sample5
1  gene1       1     2.0       3       1       2
2  gene2       4     5.0       6       3       4
3  gene3       7     0.8       9       2       6
4  gene4      10    11.0      12      15       8
> library(tidyr)#之前操作的时候,出现报错
> newresearch <- resach1%>%gather(sample_nm,exp,sample1:sample5)
#%>%链式操作;%>%的功能是用于实现将一个函数的输出传递给下一个函数的第一个参数。
#注意这里的,传递给下一个函数的第一个参数,然后就不用写第一个参数了。

#tidyr很好的一点是可以只gather若干列而其他列保持不变。
> newresearch
   geneid sample_nm  exp
1   gene1   sample1  1.0
2   gene2   sample1  4.0
3   gene3   sample1  7.0
4   gene4   sample1 10.0
5   gene1   sample2  2.0
6   gene2   sample2  5.0
7   gene3   sample2  0.8
8   gene4   sample2 11.0
9   gene1   sample3  3.0
10  gene2   sample3  6.0
11  gene3   sample3  9.0
12  gene4   sample3 12.0
13  gene1   sample4  1.0
14  gene2   sample4  3.0
15  gene3   sample4  2.0
16  gene4   sample4 15.0
17  gene1   sample5  2.0
18  gene2   sample5  4.0
19  gene3   sample5  6.0
20  gene4   sample5  8.0
> unique(newresearch$sample_nm)#表示筛选出这类数据#unique去重复
[1] "sample1" "sample2" "sample3" "sample4" "sample5"
#gather()里面聚合列的表达式可以有多种变化,但输出的结果是一样的
#gather(key="sample_nm",value="exp",sample1,sample2,sample3,sample4,sample5)
#gather(key="sample_nm",value="exp",-geneid)
> newresearch2 <- resach1%>%gather(key="sample_nm",value="exp",sample1,sample3,sample5)#不连续选取
#还可以任意提取行数聚合,未聚合列的不变
> head(newresearch2)
  geneid sample2 sample4 sample_nm exp
1  gene1     2.0       1   sample1   1
2  gene2     5.0       3   sample1   4
3  gene3     0.8       2   sample1   7
4  gene4    11.0      15   sample1  10
5  gene1     2.0       1   sample3   3
6  gene2     5.0       3   sample3   6

2.2 spread() 长数据变宽数据

spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)
data:为需要转换的长形表
key:需要将变量值拓展为字段的变量
value:需要分散的值
fill:对于缺失值,可将fill的值赋值给被转型后的缺失值

接上面
> nrspread <- newresearch%>%spread(sample_um,exp)#同样,管道数据直接传递给下一个函数的第一个参数。
> nrspread 
  geneid sample1 sample2 sample3 sample4 sample5
1  gene1       1     2.0       3       1       2
2  gene2       4     5.0       6       3       4
3  gene3       7     0.8       9       2       6
4  gene4      10    11.0      12      15       8

2.3 unite--多列合并为一列

unite(data, col, …, sep = “_”, remove = TRUE)
data:为数据框
col:被组合的新列名称
…:指定哪些列需要被组合
sep:组合列之间的连接符,默认为下划线
remove:是否删除被组合的列

#先构建一个数据框
> set.seed(1)
> date <- as.Date('2016-11-01') + 0:14
> hour <- sample(1:24, 15)
> min <- sample(1:60, 15)
> second <- sample(1:60, 15)
> event <- sample(letters, 15)
> data <- data.table(date, hour, min, second, event)
> data
          date hour min second event
 1: 2016-11-01    7  30     29     u
 2: 2016-11-02    9  43     36     a
 3: 2016-11-03   13  58     60     l
 4: 2016-11-04   20  22     11     q
 5: 2016-11-05    5  44     47     p
 6: 2016-11-06   18  52     37     k
 7: 2016-11-07   19  12     43     r
 8: 2016-11-08   12  35      6     i
 9: 2016-11-09   11   7     38     e
10: 2016-11-10    1  14     21     b
11: 2016-11-11    3  20     42     w
12: 2016-11-12   14   1     32     t
13: 2016-11-13   23  19     52     h
14: 2016-11-14   21  41     26     s
15: 2016-11-15    8  16     25     o
#将date和hour合并起来命名为datehour,用函数unite()
> datehournew <- data%>%unite(datehour,date,hour,sep = " ")
#也可以不用链式,unite(data,datehour,date,hour,sep = " ")
> datehournew
         datehour min second event
 1:  2016-11-01 7  30     29     u
 2:  2016-11-02 9  43     36     a
 3: 2016-11-03 13  58     60     l
 4: 2016-11-04 20  22     11     q
 5:  2016-11-05 5  44     47     p
 6: 2016-11-06 18  52     37     k
 7: 2016-11-07 19  12     43     r
 8: 2016-11-08 12  35      6     i
 9: 2016-11-09 11   7     38     e
10:  2016-11-10 1  14     21     b
11:  2016-11-11 3  20     42     w
12: 2016-11-12 14   1     32     t
13: 2016-11-13 23  19     52     h
14: 2016-11-14 21  41     26     s
15:  2016-11-15 8  16     25     o
#可以同时合并多个
>datehournew2 <- datehournew%>%unite(datetime,datehour,min,second,sep = ":")
> datehournew2
               datatime event
 1:  2016-11-01 7:30:29     u
 2:  2016-11-02 9:43:36     a
 3: 2016-11-03 13:58:60     l
 4: 2016-11-04 20:22:11     q
 5:  2016-11-05 5:44:47     p
 6: 2016-11-06 18:52:37     k
 7: 2016-11-07 19:12:43     r
 8:  2016-11-08 12:35:6     i
 9:  2016-11-09 11:7:38     e
10:  2016-11-10 1:14:21     b
11:  2016-11-11 3:20:42     w
12:  2016-11-12 14:1:32     t
13: 2016-11-13 23:19:52     h
14: 2016-11-14 21:41:26     s
15:  2016-11-15 8:16:25     o

2.4 separate--将一列分离为多列

一般可用于日志数据或日期时间型数据的拆分

separate(data, col, into, sep = “分隔符”, remove = TRUE,
convert = FALSE, extra = “warn”, fill = “warn”, …)
data:为数据框
col:需要被拆分的列
into:新建的列名,为字符串向量
sep:被拆分列的分隔符
remove:是否删除被分割的列

# 可以用separate函数将数据恢复到刚创建的时候
# 首先,将datetime分为date列和time列 然后,将time列分为hour,min,second列
> datasp <- datehournew2 %>%separate(datetime, c('date', 'time'), sep = ' ') %>%separate(time, c('hour', 'min', 'second'), sep = ':')
> datasp
          date hour min second event
 1: 2016-11-01    7  30     29     u
 2: 2016-11-02    9  43     36     a
 3: 2016-11-03   13  58     60     l
 4: 2016-11-04   20  22     11     q
 5: 2016-11-05    5  44     47     p
 6: 2016-11-06   18  52     37     k
 7: 2016-11-07   19  12     43     r
 8: 2016-11-08   12  35      6     i
 9: 2016-11-09   11   7     38     e
10: 2016-11-10    1  14     21     b
11: 2016-11-11    3  20     42     w
12: 2016-11-12   14   1     32     t
13: 2016-11-13   23  19     52     h
14: 2016-11-14   21  41     26     s
15: 2016-11-15    8  16     25     o
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容