安装和加载tidyr包
因为之前安装过tidyverse包,已经将tidyr包含在内,所以就直接library啦,不过以防将来需要,还是学习一下更换镜像的方法
新建并查看数据框
> a<-data.frame(GeneId=rep("gene5",times=3),SampleNames=paste("Sample",1:3,sep=""),Expression=c(14,19,18))
> View(a)
Reshape data
先输入数据啦
看来paste指令的默认分隔符的确是空格啦,如果强迫症如我一定要跟原表一样,千万别忘了sep=""哦
确实自动加了X呢…所以原来那个数据怎么来的?从csv直接读取的吗?
正式reshape
但是View(t)的话,发现t的结构并没有发生变化
然后再进行spread操作发现并不能实现
我的理解是,gather操作只在这一步有效,并不对你的原始数据框作出改变。这个reshape是一次性的而不是永久的,如果需要用reshape后的数据做接下来的操作,可以试试gather()%>%或者将gather后的数据赋值给一个新的全局变量
嘻嘻先gather一下再重新按country和cases spread
Handle missing values
先导入一下示例数据
X<-read.csv('doudou.txt')
删除整行
根据上下文填一个most recent non-NA值
> fill(X,X2)#用最近的non-NA值填充数据框X中X2列的NA值
X1 X2
1 A 1
2 B 1
3 C 1
4 D 3
5 E 3
> #默认.direction是"down",向下填充,我们来试试向上
> fill(X,X2,.direction="up")
X1 X2
1 A 1
2 B 3
3 C 3
4 D 3
5 E NA
>#这里最后一行是NA值,所以它没办法填充了,我们换个数据框看看
> (Y<-read.csv("yee.txt"))
X1 X2
1 A 1
2 B NA
3 C NA
4 D 3
5 E NA
6 F 4
> fill(Y,X2,.direction="up")
X1 X2
1 A 1
2 B 3
3 C 3
4 D 3
5 E 4
6 F 4
同一列的空值填上同一个数
> replace_na(X,list(X2=2))#把数据框X中,列X2中的na值全换成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
> #我觉得这跟replace_na最大的不同就是返回的是一个tibble而不是数据框吧
看了下nesting的帮助文件
意思大概是说nesting(xxx,yyy)就只显示数据中的这两个组合?
可我还是不懂complete里用这个干嘛啊?
所以我决定去掉nesting(X1)这一句看看效果
哦豁完蛋,更看不懂了(求豆花解答!
> a
GeneId SampleNames Expression
1 gene5 Sample1 14
2 gene5 Sample2 19
3 gene5 Sample3 18
> expand(a,GeneId,SampleNames,Expression)
# A tibble: 9 x 3
GeneId SampleNames Expression
1 gene5 Sample1 14
2 gene5 Sample1 18
3 gene5 Sample1 19
4 gene5 Sample2 14
5 gene5 Sample2 18
6 gene5 Sample2 19
7 gene5 Sample3 14
8 gene5 Sample3 18
9 gene5 Sample3 19
> expand(a,nesting(SampleNames,Expression))
# A tibble: 3 x 2
SampleNames Expression
1 Sample1 14
2 Sample2 19
3 Sample3 18
> expand(a,nesting(SampleNames),GeneId,Expression)
# A tibble: 9 x 3
SampleNames GeneId Expression
1 Sample1 gene5 14
2 Sample1 gene5 18
3 Sample1 gene5 19
4 Sample2 gene5 14
5 Sample2 gene5 18
6 Sample2 gene5 19
7 Sample3 gene5 14
8 Sample3 gene5 18
9 Sample3 gene5 19
我现在好像明白nesting了,在nesting括号里的那一(或几)列就不变,然后剩下的且提到的列才进行相应的操作
那我还是没想明白complete里是干啥用??
split cells
> (sep<-read.csv("separate.txt"))
country year rate
1 A 1999 0.7K/19M
2 A 2000 2K/20M
3 B 1999 37K/172M
4 B 2000 80K/174M
5 C 1999 212K/1T
6 C 2000 213K/1T
> separate(sep,rate,into=c("cases","pop"))
country year cases pop
1 A 1999 0 7K
2 A 2000 2K 20M
3 B 1999 37K 172M
4 B 2000 80K 174M
5 C 1999 212K 1T
6 C 2000 213K 1T
Warning message:
Expected 2 pieces. Additional pieces discarded in 1 rows [1].
> ?separate
> separate(sep,rate,into=c("cases","pop"),sep="/")
country year cases pop
1 A 1999 0.7K 19M
2 A 2000 2K 20M
3 B 1999 37K 172M
4 B 2000 80K 174M
5 C 1999 212K 1T
6 C 2000 213K 1T
我试了下按cheatsheet上的代码是有问题的,不指定分隔符的情况下它是看见啥分隔符就分,所以0.7K会被分成0和7K
指定sep="/"就没问题啦
按行分割如下:
> separate_rows(sep,rate,sep="/")
country year rate
1 A 1999 0.7K
2 A 1999 19M
3 A 2000 2K
4 A 2000 20M
5 B 1999 37K
6 B 1999 172M
7 B 2000 80K
8 B 2000 174M
9 C 1999 212K
10 C 1999 1T
11 C 2000 213K
12 C 2000 1T
unite
> (uni<-read.csv("unite.txt"))
country century year
1 Afghan 19 99
2 Afghan 20 0
3 Brazil 19 99
4 Brazil 20 0
5 China 19 99
6 China 20 0
> unite(uni,century,year,col="year",sep="")
country year
1 Afghan 1999
2 Afghan 200
3 Brazil 1999
4 Brazil 200
5 China 1999
6 China 200
下面是今天的思维导图