前两天一直觉得R太难了,学的头大,通过今天的学习,终于让我摈弃前嫌,开始喜欢上了R,真的是功能强大又简洁,非常友好啊。
今天的主要是通过对R语言中tidyr包的学习,来认识R包的作用。
准备工作
一、 如何获取
方法1:去百度/谷歌XX小抄
方法2:找Rstudio的cheatsheet网站(网速好慢的)
https://www.rstudio.com/resources/cheatsheets/
方法2.我们教程里用到的包都可以到生信星球公众号回复相应的包名来获取
---摘自生信星球教程
二、了解tidyr
简单的说,这个包的作用就是“tidy”你的数据!把你要用的数据处理成标准而统一的数据框(Tidy Data),从而进行进一步的数据处理和作图。
功能
(1)数据框的变形
(2)处理数据框中的空值
(3)根据一个表格衍生出其他表格
(4)实现行或列的分割和合并
---摘自生信星球教程
三、安装tidyr包
准备工作---打开RStudio,设置工作目录
> getwd()
[1] "C:/Users/Administrator/Documents"
> setwd("C:/Users/Administrator/Desktop/RData")
> getwd()
[1] "C:/Users/Administrator/Desktop/RData"
1.检查是否安装
library(tidyr)
Error in library(tidyr) : 不存在叫‘tidyr’这个名字的程辑包
2.下载并安装tidyr
install.packages("tidyr")
Tips:若安装报错,则更改RStudio的镜像为国内的(在安装R/RStudio那一节的教程有提到,不再赘述)。
3.重新加载tidyr
library(tidyr)
四、数据框小常识
1.新建数据框
后面的学习会需要我们新建数据框,所以要提前get这个技能。
语法示例:
a <- data.frame(GeneId = rep("gene5",times=3),SampleName = paste("Sample",1:3,sep = ""),Expression = c(14,19,18))
> a
GeneId SampleName Expression
1 gene5 Sample1 14
2 gene5 Sample2 19
3 gene5 Sample3 18
tips:
- rep---重复,括号中填要重复的字符和重复次数。
- paste---连接两个字符串,括号要填两个代连接字符并指定分隔符(sep),没有分隔符就填sep=“”。
- 1:3---表示从1到三。如需一列中需要填入三个无规律的数字,可以用向量c(1,3,4),同样如果填的是字符串也需要加双引号,例如c("doudou","huahua","xiaoyu")。
---摘自生信星球教程
2.了解概念:key-value--“键值对”
表示一种对应关系。“键”和“值”都是列名,如SampleName和Expression的对应。
Tips:本节似乎没有用到,虽然在度娘上搜索学习了一下,感觉自己没有什么深刻的认识。
3.Tips
- 函数后面一般都要加括号,括号里第一个参数是都数据框名
- 字符串要加双引号(行名和列名也是字符串,但是可以不用加),其他单元格(姑且这么叫了)里出现的字符串要加。
- 行 raw
列 column,简化写法为col
---摘自生信星球教程
四、认识Tidy Data
这是一种组织表格数据的方式,提供了一种能够跨包使用的“统一”的数据格式。
tidyr的基本操作
一、Reshape Data(数据重塑)
- 新建数据框a。
a <- data.frame(country=c("a","B","C"),`1999`=paste(c(0.7,37,212),"K"),`2000`=paste(c(2,80,213),"K"))
> a
country X1999 X2000
1 a 0.7 K 2 K
2 B 37 K 80 K
3 C 212 K 213 K
- gather函数
将宽数据变成长数据格式
1.语法
gather(data, key, value, …, na.rm = FALSE, convert = FALSE)
data:需要被转换的宽形表
key:将原数据框中的所有列赋给一个新变量key
value:将原数据框中的所有值赋给一个新变量value
…:可以指定哪些列聚到同一列中
na.rm:是否删除缺失值
2.示例
gather(a,"year","cases",X1999,X2000)
country year cases
1 a X1999 0.7 K
2 B X1999 37 K
3 C X1999 212 K
4 a X2000 2 K
5 B X2000 80 K
6 C X2000 213 K
3.Tips:三种命令比较
gather(a,X1999,X2000,key = "year",value = "cases")#正常的做法
gather(a,"year","cases",X1999,X2000) #推荐的偷懒做法
gather(a,year,cases,-country) #-country的意思就是合并除country外剩下的列。
- spread函数
将长数据变成宽数据格式
spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)
data:为需要转换的长形表
key:需要将变量值拓展为字段的变量
value:需要分散的值
fill:对于缺失值,可将fill的值赋值给被转型后的缺失值
二、Handle Missing Values(处理丢失的数据)
当某些单元格有空值的情况下,需要处理这些空值。
- 读取示例数据
X <- read.csv('doudou.txt')
> X
X1 X2
1 A 1
2 B NA
3 C NA
4 D 3
5 E NA
Tips: read.csv()优点
1.支持R和Excel
2.默认分隔符是“,”,导出时也不会默认加引号。
3.转换txt不会变乱码
- 删除整行
drop_na():有空值的,整行删除掉
括号里填数据框名,依据的列名(有空值那一列的列名)
drop_na(X,X2)
X1 X2
1 A 1
4 D 3
- 根据上下文(瞎)蒙一个
fill(),根据上一行的数值填充上.
fill(X,X2)
X1 X2
1 A 1
2 B 1
3 C 1
4 D 3
5 E 3
- 同一列的空值填上同一个数
replace_na(),空值填进去特定的一个数值(还是在应付)
括号里填数据框名,要填的列名=要填的值
replace_na(X,list(X2=2))
X1 X2
1 A 1
2 B 2
3 C 2
4 D 3
5 E 2
三、Expand Tables
- complete(把空值的位置补全)
complete(X,nesting(X1),fill = list(X2=5))
# A tibble: 5 x 2
X1 X2
1 A 1
2 B 5
3 C 5
4 D 3
5 E 5
- expand(列出每列值所有可能的组合)
expand(a,country,X1999,X2000)
# A tibble: 27 x 3
country X1999 X2000
1 a 0.7 K 2 K
2 a 0.7 K 213 K
3 a 0.7 K 80 K
4 a 212 K 2 K
5 a 212 K 213 K
6 a 212 K 80 K
7 a 37 K 2 K
8 a 37 K 213 K
9 a 37 K 80 K
10 B 0.7 K 2 K
# ... with 17 more rows
四、split cells(把一列拆成两列或多列)
- 建立新数据框
b <- data.frame(country=c("A","B","C"),year=c(1999,2000,2001),rate=c("1999-1","2000-2","2001-3"))
> b
country year rate
1 A 1999 1999-1
2 B 2000 2000-2
3 C 2001 2001-3
- separate:按列分割
1.语法
separate(data, col, into, sep = “[^[:alnum:]]+”, remove = TRUE, convert = FALSE, extra = “warn”, fill = “warn”, …)
data:为数据框
col:需要被拆分的列
into:新建的列名,为字符串向量
sep:被拆分列的分隔符
remove:是否删除被分割的列
2.示例
separate(b,rate,into=c("cases","pop"),sep = "-")
country year cases pop
1 A 1999 1999 1
2 B 2000 2000 2
3 C 2001 2001 3
- separate_rows:按行分割
separate_rows(b,rate,sep = "-")
country year rate
1 A 1999 1999
2 A 1999 1
3 B 2000 2000
4 B 2000 2
5 C 2001 2001
6 C 2001 3
- unite:分割完了再合并回去
1.语法:
unite(data, col, …, sep = “_”, remove = TRUE)
data:为数据框
col:被组合的新列名称
…:指定哪些列需要被组合
sep:组合列之间的连接符,默认为下划线
remove:是否删除被组合的列
2.示例
unite(b,year,rate,col = "year",sep = "-")
country year
1 A 1999-1999-1
2 B 2000-2000-2
3 C 2001-2001-3
Tips:这个合并结果和我想象的不一样,嗯....还需要再研究研究。