数据处理

2022-10-25 19:47:16 浏览数 (2)

背景

在使用 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

有些板块也可以预设为大家日常趣事的分享等,欢迎大家来提建议。

0 人点赞