创建R的数据格式
2022-07-01 本文已影响0人
Bioinfor生信云
R软件自带了很多数据集(data set),并附有这些数据集的分析和绘图示例,可在学习R语言时使用。用data()函数可查看R软件的自带数据集输入数据集的名称可查看该数据,用help(数据集名称)可查看该数据集的详细信息。比如,要查看泰坦尼克号的数据,输入Titanic即可,要查看该数据的详细信息,输入help(Titanic)或“?Titanic”即可。
用R软件分析数据或创建一个图形时,首先要有分析或绘图的数据集。R语言处理的数据集类型包括向量、矩阵、数组、数据框、因子和列表。
向量、矩阵和数组
向量
向量是一个一维数组,是R语言的原子类型。在R中录入一个向量需要用c函数。
创建向量
v1 <- c(1,2,3,4,5) #数值型向量
v2 <- c("chr1","chr2","chr3") #字符型向量
v3 <- c("TURE","FALSE") #逻辑型向量
快速创建连续的整数向量
1:5
快速创建重复的向量
rep(3,10)
取值
向量的索引也是一个向量
按位置
向量的位置是从1开始
v1[1:3]
[1] 1 2 3
v1[-c(1,4)]
[1] 2 3 5
按逻辑
v[v%%2==0]
[1] 2 4
按名称
names(v1) <- c('chr1','chr2','chr3','chr4','chr5')
chr1 chr2 chr3 chr4 chr5
1 2 3 4 5
计算
v1+1
chr1 chr2 chr3 chr4 chr5
2 3 4 5 6
矩阵
矩阵是一个二维数组,其中的每个元素都是相同的数据类型。用matrix函数可以创建矩阵。
a <- 1:6 #生成1-6的数值向量
mat <- matrix(a, #创建向量a的数值矩阵
nrow = 2, #矩阵的行数为2
ncol = 3, #矩阵的列数为3
byrow = TRUE) #按行填充矩阵的元素
mat
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
给矩阵添加行名和列名
rownames(mat)=c('chr1','chr2') #行名
colnames(mat)=c('A','B','C') #列名
mat
A B C
chr1 1 2 3
chr2 4 5 6
转置
t(mat)
chr1 chr2
A 1 4
B 2 5
C 3 6
数组
数组与矩阵类似,但维数可以大于2,使用array函数可以创建数组。
#创建一个2x3x4的数组
dim1<-c('A','B') #指定第一个维度为2个元素
dim2<-c('gene1','gene2','gene3') #指定第一个维度为3个元素
dim3<-c('chr1','chr2','chr3','chr4') #指定第一个维度为4个元素
data<-round(runif(24,50,100)) #生成24个均匀分布的随机数并取整
d<-array(data,c(2,3,4),dimnames=list(dim1,dim2,dim3)) #创建数值并赋值给对象d
d
, , chr1
gene1 gene2 gene3
A 51 64 66
B 64 62 81
, , chr2
gene1 gene2 gene3
A 72 78 59
B 85 68 85
, , chr3
gene1 gene2 gene3
A 78 96 86
B 92 71 93
, , chr4
gene1 gene2 gene3
A 66 82 50
B 89 57 87
数据框
创建
使用data.frame函数可以创建数据框,数据框的每一列叫做变量,每一行叫做观测值。
df <- data.frame(S1 = c(1, 2, 3, 4, 5),
S2 = c(5, 4, 3, 2, 1),
S3 = runif(5, -10, 10), #-10到10之间生成5个数
S4 = runif(5, -10, 10))
df
S1 S2 S3 S4
1 1 5 4.285124 -4.4689417
2 2 4 -4.664863 -0.6102111
3 3 3 -2.872251 -3.7848300
4 4 2 2.064181 -6.9652761
5 5 1 9.594043 0.5476802
colnames(df) #查看列名
rownames(df) #查看行名
ncol(df) #查看列数
nrow(df) #查看行数
dim(df) #查看行数和列数
head(df, n = 2) #查看前2行
rownames(df) <- c('gene1','gene2','gene3','gene4','gene5')
df
S1 S2 S3 S4
gene1 1 5 4.285124 -4.4689417
gene2 2 4 -4.664863 -0.6102111
gene3 3 3 -2.872251 -3.7848300
gene4 4 2 2.064181 -6.9652761
gene5 5 1 9.594043 0.5476802
取值
提取变量
返回一个向量
df$S1
[1] 1 2 3 4 5
df[2,2]
[1] 4
按位置
df[1:3,1:3]
S1 S2 S3
gene1 1 5 4.285124
gene2 2 4 -4.664863
gene3 3 3 -2.872251
按名称
df[c('gene1', 'gene3'),c('S1', 'S2')]
S1 S2
gene1 1 5
gene3 3 3
按逻辑
筛选S1中表达大于1的基因,只选择S2和S4两列
subset(df, S1>1, select = c('S2','S4'))
S2 S4
gene2 4 -0.6102111
gene3 3 -3.7848300
gene4 2 -6.9652761
gene5 1 0.5476802
计算
与向量计算
head(df + c(1,2))
S1 S2 S3 S4
gene1 2 7 5.285124 -2.4689417
gene2 4 5 -2.664863 0.3897889
gene3 4 5 -1.872251 -1.7848300
gene4 6 3 4.064181 -5.9652761
gene5 6 3 10.594043 2.5476802
按行和列计算
rowSums(df)
colSums(df)
rowMeans(df)
colMeans(df)
#也可以使用apply函数按行或列进行计算
apply(df, 1, mean)
数据框的合并
如果需要合并不同的数据框,使用rbind函数可以将不同的数据框按行合并;使用cbind函数可以将不同的数据框按列合并。但需要注意,按行合并时,数据框中的列变量必须相同;按列合并时,数据框中的行变量必须相同,否则合并是没有意义的。
数据框的排序
sort(df$S3, decreasing = TRUE) #降序排列
[1] 9.594043 4.285124 2.064181 -2.872251 -4.664863
如果要对整个数据库中的数据排序,可以使用dplyr R包。
按照S3升序排列
arrange(df, S3)
S1 S2 S3 S4
gene2 2 4 -4.664863 -0.6102111
gene3 3 3 -2.872251 -3.7848300
gene4 4 2 2.064181 -6.9652761
gene1 1 5 4.285124 -4.4689417
gene5 5 1 9.594043 0.5476802
按照S4降序排列
arrange(df, desc(S4))
S1 S2 S3 S4
gene5 5 1 9.594043 0.5476802
gene2 2 4 -4.664863 -0.6102111
gene3 3 3 -2.872251 -3.7848300
gene1 1 5 4.285124 -4.4689417
gene4 4 2 2.064181 -6.9652761
因子和列表
因子
类别变量在R软件中称为因子(factor),因子的取值称为水平(level)。很多分析或绘图都可以按照因子的水平进行分类处理。
使用factor函数可以将向量编码为因子。
#将无序因子转换为数值
g <- c('生物','物理','化学','生物') #因子向量g
f <- factor(g) #将向量g编码为因子
f
[1] 生物 物理 化学 生物
Levels: 化学 生物 物理
as.numeric(f) #将因子g转换为数值
[1] 2 3 1 2
列表
列表是一些对象的集合,它是R软件中较复杂的形式,一个列表中可能包含若干向量、矩阵、数据框等。使用list函数可以创建列表
数据类型
数值型
a <- c(1, -2, 3.53)
b <- c(1, 3, 4.5)
round(a, digits = 1) #四舍五入到指定小数
abs(a) #绝对值
aqrt(a) #开平方
sum(a) #求和
sd(a) #求标准差
a * b
a ** b
a / b #相除
a %% b #整除求余
cor(a, b) #求相关性
字符型
s <- c('A', 'BB', 'CCC', 'DDDD' )
library(stringr, quietly = T) #使用stringr进行字符串处理
str_count(s, 'B') #计数
[1] 0 2 0 0
str_sub(s, 1, 3) #按位置切分
[1] "A" "BB" "CCC" "DDD"
str_subset(s, 'D') #包含D的元素
[1] "DDDD"
str_length(s) #求长度
[1] 1 2 3 4
str_replace(s,'A', 'E') #替换
[1] "E" "BB" "CCC" "DDDD"
str_to_lower(s) #转小写
[1] "a" "bb" "ccc" "dddd"
str_c(c('chr1','chr2','chr3','chr4'),s,sep = ':') #连接
[1] "chr1:A" "chr2:BB" "chr3:CCC" "chr4:DDDD"
str_split(s,'',simplify = T) #拆分
[,1] [,2] [,3] [,4]
[1,] "A" "" "" ""
[2,] "B" "B" "" ""
[3,] "C" "C" "C" ""
[4,] "D" "D" "D" "D"
str_sort(s) #排序
[1] "A" "BB" "CCC" "DDDD"
逻辑型
x <- c(T,F,T)
y <- c(F,F,F)
x | y # 或
[1] TRUE FALSE TRUE
x | | y # 或
[1] TRUE
x & y #与
[1] FALSE FALSE FALSE
x && y $与
[1] FALSE
!x #非
[1] FALSE TRUE FALSE