背景
在使用 R 语言的过程中,需要给函数正确的数据结构。因此,R 语言的数据结构非常重要。通常读入的数据并不能满足函数的需求,往往需要对数据进行各种转化,以达到分析函数的数据类型要求,也就是对数据进行“塑形”,因此,数据转换是 R 语言学习中最难的内容,也是最重要的内容。
一、R 与 Linux 和 Python 相似的操作
1、获取工作目录
代码语言:javascript复制Linux: pwd (print word directory)
R:getwd()函数,获取工作目录
python:import os;os.getcwd()
2、清空屏幕
ctrl L 快捷键
3、移动光标
ctrl A:行首
ctrl E:行尾
4、转义字符
代码语言:javascript复制n:换行符
t:制表符
5、for 循环
代码语言:javascript复制Linux:for i in {1..10};do echo $i;done;
R:for (i in 1:10){print (i)}
for i in range(1,10):print (i);
6、head,tail
Linux: head,tail 命令,默认 10 行
R:head(),tail()函数,默认文件六行
python:import pandas as pd;pd.head(),pd.tail()函数
7、cut
Linux: cut 用来拆分文件,可以按大小,字符数,行以及分隔符来拆分;
R:可以将一个连续型向量拆分为离散型,例如0-100,拆分成0-60,60-70,70-80,80-90,90-100几份。
python:pandas 中 cut 函数,与 R 中 cut 类似。
8、grep
Linux: 用于搜索文件内的内容,支持正则表达式
R:用于搜索变量内的内容,支持正则表达式
python:用于搜索变量内的内容,支持正则表达式
9、paste
Linux: 粘贴不同文件内容,与 cut 刚好相反
R:合并不同向量,可以指定分隔符,
python:与 R 类似。
10、cat
Linux,R,python 中都是查看文件,将文件内容在终端输出。
11、sort
排序,可以按照数值大小,也可以按照 ascii 码排序。
12、printf
pirntf 主要用于格式化打印,例如可以直接在 printf 中设置保留有效数字,转换类型等,支持各种转义。
代码语言:javascript复制printf "姓名:%sn 身高:�mn 体重:%dkgn" "小明" "180" "75"
姓名:小明
身高:180cm
体重:75kg
二、判断数据类型
R中包含很多查看数据属性的函数,例如mode(),class(),str()等,此外还有is*系列函数与as系列函数。
代码语言:javascript复制x <- c(1:100)
x
is.vector(x)
is.numeric(x)
is.character(x)
as.character(x)
letters
as.numeric(letters)
mtcars[1:10,1:10]
mtcars$cyl
is.numeric(mtcars$cyl)
as.factor(mtcars$cyl)
plot(as.numeric(mtcars$cyl))
plot(as.factor(mtcars$cyl))
x <- read.csv('heatmap.csv',row.names = 1)
head(x)
heatmap(x)
heatmap(as.matrix(x))
三、筛选
筛选主要是将满足一定条件的内容挑选出来,例如等于某个值,或者大于,小于等,如果是字符串就是字符串的匹配。
代码语言:javascript复制data('mtcars')
mtcars$mpg >= 20
mtcars[mtcars$mpg >= 20,]
mtcars$mpg >= 20 & mtcars$cyl == 4
mtcars[mtcars$mpg >= 20 & mtcars$cyl == 4,]
四、排序
排序需要给定排序标准,首先确定是对数字排序还是字符串排序,数字一般是按照大小顺序,字符串按照首字母顺序排序。可以对一维数据排序,也可以对多维数据排序。R 提供了 sort和 order 等排序方法,order 是对索引进行排序,在 R 中使用地更多。
代码语言:javascript复制#排序
rivers
sort(rivers)
sort(rivers, decreasing = T)
rev(sort(rivers))
order(rivers) #从小到大排序的索引值
rivers[order(rivers)]
rivers[order(-rivers)]
#对二维数据排序
mtcars$cyl
order(mtcars$cyl)
sort(mtcars$cyl,decreasing = T)
order(mtcars$cyl,decreasing = T)
mtcars[order(mtcars$cyl,decreasing = T),]
#多个值排序
order(mtcars$cyl,mtcars$mpg,decreasing = T)
mtcars[order(mtcars$cyl,mtcars$mpg,decreasing = T),]
mtcars[order(mtcars$cyl,mtcars$mpg,decreasing = c(T,F)),]
五、修改数据内容
数据分析中经常需要对原数据中的某些地方进行修改。修改数据属于赋值操作,也就是将原有的值赋一个新的值,这就需要首先能够将要修改的值索引出来,然后重新赋值即可。如果要修改某一行或者某一列的内容,则可以先索引出这一行或一列的内容,然后批量赋值。如果需要增加或者删除某一行或者某一列,可以使用 rbind 或者 cbind 函数。
代码语言:javascript复制#修改数据
mtcars
mtcars$cyl
mtcars$cyl[mtcars$cyl == 4] <- 'four'
mtcars$cyl[mtcars$cyl == 6] <- 'six'
mtcars$cyl[mtcars$cyl == 8] <- 'eight'
as.factor(mtcars$cyl)
data('mtcars')
ncol(mtcars)
mtcars$cylinders <- NA
mtcars$cylinders[mtcars$cyl == 8] <- 'eight cylinders'
mtcars$cylinders[mtcars$cyl == 4] <- 'four cylinders'
mtcars$cylinders[mtcars$cyl == 6] <- 'six cylinders'
mtcars$cyl <- as.factor(mtcars$cyl)
levels(mtcars$cyl)
levels(mtcars$cyl) <- c('four', 'six', 'eight')
代码语言:javascript复制#rbind,cbind
state <- cbind(as.data.frame(state.x77),state.region)
tapply(state$Population, state$state.region, mean)
a <- head(mtcars,20)
b <- tail(mtcars,20)
c <- rbind(a,b)
length(rownames(c))
duplicated(c)
c[duplicated(c),]
c[!duplicated(c),]
unique (c)
#取子集 subset
dta <- read.csv("gene93.csv")
dta
#过滤掉没有表达的转录本
dta1 <- subset(dta,rowSums(dta[1:8])>1)
写在最后:有时间我们会努力更新的。大家互动交流可以前去论坛,地址在下面,复制去浏览器即可访问,弥补下公众号没有留言功能的缺憾。原地址暂未启用(bioinfoer.com)。
代码语言:javascript复制sx.voiceclouds.cn
有些板块也可以预设为大家日常趣事的分享等,欢迎大家来提建议。