数据的随机取样如何可重复?
#从字母中随机取十个字母
>sample(letters,10)
>sample(letters,10)
[1] "d" "c" "l" "q" "t" "v" "n" "b" "o" "u"
> sample(letters,10)
[1] "d" "b" "i" "q" "o" "v" "l" "m" "w" "j"
> sample(letters,10)
[1] "t" "q" "f" "j" "u" "g" "b" "x" "w" "h"
#我们可以看到每次取的都不一样,如果想让随机取样,可以重复。
> set.seed(10201)#数字随意
> sample(letters,10)
[1] "a" "z" "r" "x" "h" "c" "f" "q" "w" "e"
> set.seed(10201)#数字随意
> sample(letters,10)
[1] "a" "z" "r" "x" "h" "c" "f" "q" "w" "e"
如果从26字母抽200个呢?
sample(letters,200)
#报错,不能取比总体还大的样本。有句代码可以让中文报错改为英文。
Sys.setenv(LANGUAGE = "en")
#寻求语法的帮助,以sample为例。
?sample
sample的说明
sample(x, size, replace = FALSE, prob = NULL)
当replace=FALSE的时候说明不给重复,意思是取样后不放回。下面可以修改一下。
sample(letters,50,replace=T)
[1] "m" "m" "i" "t" "o" "l" "o" "f" "l" "w" "d" "z" "x" "y" "v"
[16] "d" "s" "o" "q" "p" "t" "n" "f" "d" "b" "n" "d" "x" "g" "p"
[31] "m" "p" "c" "z" "h" "g" "d" "o" "x" "k" "i" "y" "z" "s" "w"
[46] "m" "o" "k" "d" "y"
想统计一下这里面共有多少个取值。(去重后算长度)
#unique
x=sample(letters,50,replace=T)
> unique(x)
[1] "q" "i" "o" "y" "n" "c" "p" "r" "x" "s" "l" "t" "z" "j" "g"
[16] "b" "d" "e" "w" "m" "h" "u"
length(unique(x))
[1] 22
table(x)
x
b c d e g h i j l m n o p q r s t u w x y z
1 1 2 3 4 2 4 1 1 4 2 2 2 4 4 2 1 1 1 2 3 3
> length(table(x))
[1] 22
> sum(!duplicated(x))
[1] 22
向量如何生成矩阵。
什么是矩阵,列的数据类型都相同,有两个维度,行数和列数。
可以用class判断是矩阵还是数据框。
x=1:10
> x
[1] 1 2 3 4 5 6 7 8 9 10
> matrix(x)#默认是一列
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
[7,] 7
[8,] 8
[9,] 9
[10,] 10
> matrix(x,nrow = 3)#nrow 直接记就是行数,number row别想这么多。
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 1
[3,] 3 6 9 2
Warning message:
In matrix(x, nrow = 3) :
data length [10] is not a sub-multiple or multiple of the number of rows [3]
向量长度相同,数据类型相同,可以连接在一起。
x1=sample(letters,5)
> x1=sample(letters,5);x1
[1] "r" "p" "h" "g" "k"
> x2=sample(letters,5);x2
[1] "x" "r" "t" "s" "g"
> x3=sample(letters,5);x3
[1] "i" "j" "g" "f" "s"
> cbind(x1,x2,x3)#按列拼接
x1 x2 x3
[1,] "r" "x" "i"
[2,] "p" "r" "j"
[3,] "h" "t" "g"
[4,] "g" "s" "f"
[5,] "k" "g" "s"
数据框
长度相同,数据类型不同,可以组成数据框。数据类型可以不同。
#生成数据框,数据类型不同
> y1=sample(1:10,7);y1
[1] 10 1 6 5 2 7 4
> y2=(letters)
> y2=letters[2:8];y2
[1] "b" "c" "d" "e" "f" "g" "h"
> y3=sample(1:100,7);y3
[1] 75 29 46 62 18 99 85
> date.frame(y1,y2,y3)
Error in date.frame(y1, y2, y3) : could not find function "date.frame"
> data.frame(y1,y2,y3)
y1 y2 y3
1 10 b 75
2 1 c 29
3 6 d 46
4 5 e 62
5 2 f 18
6 7 g 99
7 4 h 85
List 列表:长度可以不同、数据类型可以不同
列表没有行和列的概念,可以有多级元素。用到的不多,会取子集就可以。
可以包含向量 数据框 矩阵或数据框 列表
它的每个子集可以用[[1]] [[2]] [[3]] [[4]] 对应上面的
各种嵌套式的都是可以从外面往里写。绝对路径的可能换个电脑,文件夹命名各不相同,所以不推荐使用这种方法。
数据框属性描述 dimention row colum
1.维度(有几行几列)
2.行列的名字
x=data.frame(a=1:10,b='gene');x
a b
1 1 gene
2 2 gene
3 3 gene
4 4 gene
5 5 gene
6 6 gene
7 7 gene
8 8 gene
9 9 gene
10 10 gene
> dim(x)
[1] 10 2
> row.names(x)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
> colnames(x)
[1] "a" "b"
数据框取子集(一个,一行,一列,多行多列)
#向量取子集
> x=c(1,8,9,1,6,5,6)
> x[5]
[1] 6
> x[c(1,5)]
[1] 1 6
> #取第一个和第六个
#数据框取子集,按照坐标来。
data.frame(gene=1:10,nrow=2)
gene nrow
1 1 2
2 2 2
3 3 2
4 4 2
5 5 2
6 6 2
7 7 2
8 8 2
9 9 2
10 10 2
> z=data.frame(gene=1:10,nrow=2)
> z[4,1]
[1] 4
#如果不写列,就是默认包括所有列,这是逻辑的根本。
z[2,]
gene nrow
2 2 2
#中括号的逗号,表示维度的分隔。中括号用来取子集,小括号给函数划范围。
x=8:12;x
[1] 8 9 10 11 12
> x[1,5]
Error in x[1, 5] : incorrect number of dimensions
> x=[c(1,5)]
Error: unexpected '[' in "x=["
> x[c(1,3)]
[1] 8 10
#根据行名和列名也可以取子集
z[,'gene']#注意打名字的时候是文字,需要引号。
[1] 1 2 3 4 5 6 7 8 9 10
#进阶理解,比如说我们要经常取某些子集,改的话还好改,赋值给的变量,改一次,后面的内容都改掉了。
mm=c(1,2)
> z[,mm]
z[c(1,2,3),mm]
gene nrow
1 1 2
2 2 2
3 3 2