在实际操作中与我们打交道的是各种各样的数据,因此了解这些数据以及它们的组合的各种性质是进行其他所有操作的基石。在此进行归纳整理以帮助读者建立基础认知
注意:这篇推文中的绝大多数代码和所有的图片都来自“生信技能树”的小洁老师,在此向她表达诚挚的感谢!
在日常生活中我们会接触到哪些数据呢?就拿鼠鼠来开涮,能在我身上去找到R语言的数据类型:
1.鼠鼠身高多少厘米,给我一个数字。
2.鼠鼠的专业是什么?
3.鼠鼠是人类吗(正确回答TRUE, 错误回答F)?
那么我给到的答案分别是:
1.178
2.口腔医学
3.TRUE
在对鼠鼠进行简单背调之后你已经对R语言的数据类型有了最直观的感受了,178是数值型(Numeric) ,口腔医学属于字符型(Character)(在R语言里写成"口腔医学"),而TRUE属于逻辑型(Logical)(另外一个逻辑值是FALSE,它们也可以简写为T和F)。
提问:只要有阿拉伯数字就一定是数值型的数据吗? 答案是否定的,如果数字被引号框起来那它就是一个字符串! 对于数据类型的判断在R语言中可以采用这个代码:
class(x) #其中x是你指定的变量名,也可以直接把数据放进去R中有很多种数据结构,最常用的有以下几种:
向量 矩阵 数据框 列表 (其实我知道还有数组和因子之类的)
那么我们开始吧
向量是一种一维结构(其实可以理解成数学中的集合),里面有n个元素,但是这n个元素必须是同一种数据类型:
比如:
c(2,5,6,2,9) c("a","f","md","b")1:5对于向量可以取子集:
x <- 8:12x[x < 12] # 选出小于 12 的元素x[x %in% c(9,13)] # 选出在向量c(9,13) 中的元素x[4] # 取出第4个元素x[c(1,5)] # 取出第1和第5个元素x[-4] # 去掉第4个元素,返回其余矩阵是一种二维结构(学习过线代的人肯定能理解,但我没学过),可以是m行n列,但里面所有的元素仍然只能是同一种数据类型。
m <- matrix(1:9, nrow = 3) # 按列填充创建 3×3 矩阵colnames(m) <- c("a","b","c") # 给矩阵设置列名m数据框要求所有列同类型后才能转成矩阵,否则会强制转换。
dm <- data.frame(a = 1:3, b = 4:6, c = 7:9)m2 <- as.matrix(dm) # 数据框 → 矩阵m2m[,1] # 提取第 1 列,返回向量m[2:3,1:2] # 提取第 2–3 行、第 1–2 列子矩阵m[-1,] # 去掉第 1 行,返回其余数据框同样可以有m行n列,它和矩阵的区别在于不同列的数据的数据类型可以不一样,但相同的列里的元素必须是同一个数据类型:
data.frame()函数可用于创建数据框,可以用代码:
df1 <- data.frame(gene = paste0("gene",1:4), change = rep(c("up","down"),each = 2), score = c(5,3,-2,-4))df1但在实际操作中我们都是读取别人上传好了的文件(csv\tsv\txt什么的都可以读):
df2 <- read.csv("gene.csv")df2df1$gene # gene列,向量df1[,c("gene","change")]#提取df1数据框中的gene和change列,返回数据框df1[1:2,1:2] #提取df1的前两行、前两列的值,返回数据框k = df1$score>0;k #条件k,判断score列的每个值是否>0,返回逻辑值df1[k,] #提取df1中符合条件k(即k为TRUE)的值列表可装万物,前面提到的结构都可以装,甚至可以列表套列表来进行套娃操作
x <- list(m1 = matrix(1:9, nrow = 3), m2 = matrix(2:9, nrow = 2), m3 = data.frame(a = 1:2, b = 3:4))xx[[1]] # 返回矩阵 m1x$m1 # 同上,使用名称访问x[1] # 返回包含 m1 的列表x[c(1,3)] # 返回 m1 和 m3 组成的子列表这一篇推文主要叙述了R语言的数据类型和数据结构,它们是进行后续学习的基础。在我的叙述中含有一些类比和幽默的表达方式,这些部分也许不严谨,但不违背我想让自己或者其他读者能够产生主观理解的初心,如有建议还请提出!!!
Thanks!
By 鼠鼠