1. 数据结构
(1)向量为一维,只有长度(sample函数为从1到100中任取28个数字)
(2)矩阵有两个维度,长度相同,数据类型相同(matrix函数为把向量x变为7行的矩阵)
2.png
matrix(x,nrow = )#把向量变成几行的矩阵
cbind(x1,x2,x3)#把几个向量组合成一个矩阵
3.png
(3)数据框:多个长度相同,数据类型可以不同的向量按列组合
data.frame(y1,y2,y3)
(4)list 列表:长度可以不相同,数据类型也可以不同的数据
2.数据框
(1) 数据框来源
a.在R中新建 b. 由已有数据转换或处理得到 c. 从文件中读取 d. 内置数据集
(2)新建数据框
4.png
(列的内容为向量,列与列以逗号分隔)
options(stringsAsFactors = F)#3.6及以下要运行,4.0不用
df <- data.frame(gene = c("gene1","gene2","gene3"),
sam = c("sample1","sample2","sample3"),
exp = c(32,34,45))
df
df <- data.frame(gene = paste0("gene",1:3),
sam = paste0("sample",1:3),
exp = c(32,34,45))
df
df2 <- read.csv("gene.csv")#读取文件得到数据框
df2
3.数据框属性描述
#维度(有几行几列)
dim(df)#返回行数和列数
nrow(df)#行数
ncol(df)#列数
#行名/列名
rownames(df)
colnames(df)
4.数据框取子集
df[2,2]#取一个
df[2,]#取一行,逗号左边是行右边是列,不选等于全选
df[,2]#取一列
df[c(1,3),1:2]#前面为取第一行和第三行,后面取第一列和第二列
df[,"gene"]#根据行名和列名取
df[,c('gene','exp')]#取两列
nn=c('gene','exp');df[,nn]#等同于上面但此方式变换变量时更方便
df[,ncol(df)]#取最后一列
df[,ncol(df)]#去掉最后一列
df$exp #取一列的简单方法,按tab键出现列名自动补齐,$只能取一列不能取多列
mean(df$exp)#取均值,能对向量进行的计算和统计,都能对df$exp做
(中括号里的逗号,表示维度的分割)
5.数据框编辑
#改一个格
df[3,3]<- 5#把数据框的第三行第三列改成5
#改一整列
df$exp<-c(12,23,50)#一列改成一个向量,如果只改成一个数字就全等于一个数字
#增加一列,且列名为abc
df$abc <-c(23,15,37)
df
#改行名和列名
rownames(df) <- c("r1","r2","r3")
#只修改某一行/列的名,取子集再赋值
rownames(df)[2]="x"
6.数据框进阶
(1)去除含有缺失值的行
#生成一个有NA的数据框(仅按照某一列来去除缺失值、缺失值替换:tidyr包)
df<-data.frame(X1 = LETTERS[1:5],X2 = 1:5)
df[2,2] <- NA
df[4,1] <- NA
df
na.omit(df)
(2)两个表格的连接(交集、并集、补集、全集等,参照dplyr包)
1.pngtest1 <- data.frame(name = c('jimmy','nicker','doodle'),
blood_type = c("A","B","O"))
test1
test2 <- data.frame(name = c('doodle','jimmy','nicker','tony'),
group = c("group1","group1","group2","group2"),
vision = c(4.2,4.3,4.9,4.5))
test2
test3 <- data.frame(NAME = c('doodle','jimmy','lucy','nicker'),
weight = c(140,145,110,138))
tmp =merge(test1,test2,by="name")#按共同的一列智能连接,取交集
merge(test1,test3,by.x = "name",by.y = "NAME")#两列名字不一样的时候
(3)矩阵新建和取子集($只适用于数据框和列表取子集,不适用矩阵)
m <- matrix(1:9, nrow = 3)#生成矩阵
colnames(m) <- c("a","b","c") #列名
m
#整行
m[2,]
#整列
m[,1]
#单个格
m[2,3]
#多个格
m[2:3,1:2]
#转置和转换
m
t(m)
as.data.frame(m)#转换为数据框
pheatmap::pheatmap(m)#画热图
(4)列表新建和取子集
l <- list(m=matrix(1:9, nrow = 3),#(等号左边为列表里元素的名字,等号右面是列表里元素的内容)
df=data.frame(gene = paste0("gene",1:3),
sam = paste0("sample",1:3),
exp = c(32,34,45)),
x=c(1,3,5))
l
l[[2]]#向量df如果未定义名字就可写为这个,列表的向量分别为[[1]]、[[2]]、[[3]]
l$df
(5)删除变量
22.png#删除
#删除一个
rm(l)
#删除多个
rm(df,m)
#删除全部
rm(list = ls())
(6)元素的名字
#(1)向量
x=1:10
names(x)=letters[1:10]
x
x["a"]#根据名字取子集
#(2)数据框
df
names(df)
df[,"X1"]
#(3)列表
names(l)
l[["df"]]
练习
#1.统计iris最后一列有哪几个重复值,分别重复了多少次
table(iris$Species)#重复值提取用table,数据框提取一列
#2.提取iris的前4列,并转换为矩阵,赋值给test。
test <- as.matrix(iris[,1:4])
#3.将test的行名改为flower1,flower2...flower149,flower150。
rownames(test) <- paste0("flower",1:nrow(test))
#4.将test的第51到100行删除(不能用rm因为rm删除的是整个变量)
test <- test[-(51:100),]
#5.将iris和test组成一个列表,赋值给tl
tl <- list(x1=iris,x2=test)
#6.提取tl的第二个元素
tl[[2]]
tl$x2
identical(tl([2],tl[[2]])#判断两个数据类型是否相同
#7.修改tl第二个元素的名字为td
names(tl)[2] <- "td"
7. 数据框修改
df[3,3]<-5#改一个格
df$exp<-c(12,23,50)#$后的列名若存在则为修改该列的内容
df$abc<-c(23,4,67)#$后的列名若不存在则表示新增一列
* 误操作时
重新运行数据框赋值原命令然后再进行正确操作(运行错了的代码不能撤销,但可以覆盖,多次赋值以最后以此为准 )
8. match使用
两个顺序不一致的表格相匹配
#方法一
load("matchtest.Rdata")
x$file_name
colnames(y)
match(x$file_name,colnames(y))#返回了y按x顺序排列的下标
a=match(x$file_name,colnames(y))
y=y[,a]#调整y的顺序,排列成和x一样的
identical(x$file_name,colnames(y))#判断调整的是否正确
colnames(y)=x$ID
#方法二
load("matchtest.Rdata")
colnames(y)=x$ID[match(colnames(y),x$file_name)]
网友评论