Day03 生信马拉松-data.frame

2023-08-11 15:42:05 浏览数 (1)

1.data.frame来源

(1)用代码新建 data.frame()

(2)由已有数据转换或处理得到 matrix-->data.frame

(3)读取表格文件-read()

(4)R语言内置数据(iris、volcano)

2.新建和读取data.frame

2.1 新建data.frame

代码语言:javascript复制
df1 <- data.frame(gene   = paste0("gene",1:4),
                 change  = rep(c("up","down"),each = 2),
                 score   = c(5,3,-2,-4))  # “=”左边为列名,右边为列的内容
df1

2.2 读取data.frame-以read()函数为主

代码语言:javascript复制
df2 <- read.csv("gene.csv")  # read.csv()读取csv文件函数
df2

3.data.frame的属性

3.1 维度 dim(df1)

3.2 行数 nrow(df1)

3.3 列数 ncol(df1)

3.4 行名 rownames(df1)

3.5 列名 colnames(df1)

4.data.frame取子集 -"$"符 df1$gene

4.1 按坐标

代码语言:javascript复制
df1[2,2] #[ ]内前面的数字为行,后面的数字为列
df1[2,] #提出第二行(包含行名)
df1[,2] #提出第二列
df1[c(1,3),1:2] #提出第1和3行,第1-2列

4.2 按名字

代码语言:javascript复制
df1[,"gene"]
df1[,c('gene','change')]

4.2 按条件(逻辑值)

代码语言:javascript复制
df1 <- data.frame(gene   = paste0("gene",1:4),
                  change  = rep(c("up","down"),each = 2),
                  score   = c(5,3,-2,-4))
df1[df1$score>0,] #提取score>0的行

4.3 筛选score > 0的基因

代码语言:javascript复制
df1[df1$score > 0,1] #提取第1列中score>0的基因名
df1$gene[df1$score > 0] #同上 提取gene列中score>0的基因名

★拓展内容

1.提取data.frame的最后一列

代码语言:javascript复制
df1[,3]
df1[,ncol(df1)] #ncol()可以输出列数,所以为最后一列

2.提取data.frame除最后一列的其他列

代码语言:javascript复制
df1[,-ncol(df1)] #"-"表示反选,“!”处理逻辑型数据

3.按照data.frame的某一列对整个data.frame进行排序--利用order()函数

代码语言:javascript复制
df1[order(df1$score),] #默认为升序
df1[order(df1$score, decreasing = T),] #降序排列

4.按照data.frame的某一列对整个data.frame进行去重--利用distinct()函数

代码语言:javascript复制
library(dplyr)
df1 <- df1 %>% distinct(score,keep_all = T) #%>%为向右操作符
df1

5.data.frame修改

5.1 改一个格 e.p df1[3,3] <- 5

5.2 改一整列 e.p df1$score <- c(12,23,50,2)

5.3 增加新一列 e.p df1$p.value <- c(0.01,0.02,0.07,0.05)

5.4 改所有行/列名 即给向量重新赋值

e.p rownames(df1) <- c("r1","r2","r3","r4")

5.5 只修改某一行/列的名 e.p colnames(df1)[2] <- "CHANGE" 改所有行名

6.两个data.frame连接

代码语言:javascript复制
test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'), 
                    blood_type = c("A","B","O","AB"))
test1
test2 <- data.frame(name = c('Damon','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('Damon','jimmy','nicker','tony'),
                    weight = c(140,145,110,138))
test3
merge(test1,test2,by="name")
merge(test1,test3,by.x = "name",by.y = "NAME")#x对应test1,y对应test3
#如果需要data.frame合并保留不完整数据?merge()查询帮助文档

7.Matrix和List

7.1 Matrix

7.1.1 新建matrix: m <- matrix(1:9, nrow = 3)

7.1.2 给matrix加列名: colnames(m) <- c("a","b","c")

7.1.3 matrix提取--不支持"$"提取

代码语言:javascript复制
m[2,]
m[,1]
m[2,3]
m[2:3,1:2]

7.1.4 matrix行与列名转置: t(m)

7.2 List

7.2.1 新建list

代码语言:javascript复制
l <- list(m1 = matrix(1:9, nrow = 3),
          m2 = matrix(2:9, nrow = 2))
l

7.2.2 list提取

方法一: l[[2]] 提取第二个matrix

方法二: l$m2 提取第二个matrix

拓展知识:l[1]l[[1]]的区别

class(l[1])仍然是一个list

class(l[[1]])提取的是一个matrix

8.补充知识--向量中元素的名字和R中删除操作

8.1 向量中元素的名字

代码语言:javascript复制
scores = c(100,59,73,95,45)
names(scores) = c("jimmy","nicker","Damon","Sophie","tony")  #给元素加名字
scores # 仍然是数值型向量
scores["jimmy"] #提取jimmy的分数
scores[c("jimmy","nicker")]
names(scores)[scores>60] #提取scores>60的names

8.2 删除

代码语言:javascript复制
rm(l)  #删除list
rm(df1,df2) #删除data.frame
rm(list = ls()) #删除全部环境变量=清空

以上内容均引用自生信技能树

0 人点赞