数据处理 | R-tidyr包

简介: 数据处理 | R-tidyr包

本文首发于“生信补给站”公众号 数据处理 | R-tidyr包

介绍tidyr包中五个基本函数的简单用法:长转宽,宽转长,合并,分割,NA简单填充。


长数据就是一个观测对象可由多行组成,而宽数据则是一个观测仅由一行组成。


#载入所需的R包

library(dplyr)

library(tidyr)


#测试数据集

widedata <- data.frame(person=c('A','B','C'),grade=c(5,6,4),score=c(89,98,90))

widedata


 person grade score

1      A     5    89

2      B     6    98

3      C     4    90


一 宽数据转为长数据


gather(): 类似于reshape2包中的melt()函数;

gather(data, key, value, … , na.rm = FALSE, convert = FALSE):

data:需要被转换的宽形表

key:将原数据框中的所有列赋给一个新变量key

value:将原数据框中的所有值赋给一个新变量value

...:可以指定哪些列聚到一列中

na.rm:是否删除缺失值


将示例数据集转成长数据:

longdata <- gather(widedata, variable, value)

longdata


variable value

1   person     A

2   person     B

3   person     C

4    grade     5

5    grade     6

6    grade     4

7    score    89

8    score    98

9    score    90


只把制定变量从宽数据变成长数据的功能,person不变成长数据

gather(widedata, variable, value, -person)


 person variable value

1      A    grade     5

2      B    grade     6

3      C    grade     4

4      A    score    89

5      B    score    98

6      C    score    90


gather()函数比reshape2包中melt()函数的优势: 它可以只gather若干列而其他列保持不变:


age <- c(20, 21, 22)

wide <- data.frame(widedata, age)

wide


 person grade score age

1      A     5    89  20

2      B     6    98  21

3      C     4    90  22


先对widedata增加一列 age. 整合两个变量之间的若干列, 而保持其他列不变:


long <- gather(wide, variable, value, grade:age)

long


 person variable value

1      A    grade     5

2      B    grade     6

3      C    grade     4

4      A    score    89

5      B    score    98

6      C    score    90

7      A      age    20

8      B      age    21

9      C      age    22



二 长数据转为宽数据


spread():类似于reshape2包中的cast()函数;

spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)

data:为需要转换的长形表

key:需要将变量值拓展为字段的变量

value:需要分散的值

fill:对于缺失值,可将fill的值赋值给被转型后的缺失值


将长数据转成宽数据:

wide <- spread(long, variable, value)

wide


 person age grade score

1      A  20     5    89

2      B  21     6    98

3      C  22     4    90


这实际将原来gather后的结果还原为gather前, 但各列的相互位置稍有调整.


三 多列合并为一列


unite(data, col, … , sep = " ")

data::表示数据框,

col:表示合并后的列名称,

… :表示需要合并的若干变量,

sep: = " "用于指定分隔符,

remove:是否删除被组合的列


把widedata中的person,grade, score三个变量合成一个变量information, 并变成"person-grade-score"的格式


wideunite<-unite(widedata, information, person, grade, score, sep= "-")

wideunite


 information

1      A-5-89

2      B-6-98

3      C-4-90


四 一列分离为多列.


separate(data, col, into, sep = " ")

data:为数据框

col:需要被拆分的列

into:要拆分为的(多个)列, 通常用c()的形式进行命名

sep : = " " 用于指定分隔符

remove:是否删除被分割的列


用separate函数将上面的wideunite数据框还原:


widesep <- separate(wideunite, information,c("person","grade","score"), sep = "-")

widesep


 person grade score

1      A     5    89

2      B     6    98

3      C     4    90


可见separate()函数和unite()函数的功能是相反的.


五 缺失值填充


示例数据集,增加NA值


NAdata <- data.frame(person=c('A','B','C','D'),grade=c(5,NA,4,7),score=c(89,98,NA,89))

NAdata


 person grade score

1      A     5    89

2      B    NA    98

3      C     4    NA

4      D     7    89


计算x的均值和中位数

x_mean <- mean(NAdata$grade, na.rm = TRUE)

x_median <- median(NAdata$grade, na.rm = TRUE)

计算y的众数

y_mode <- as.character(NAdatascore[which.max(table(NAdatascore[which.max(table(NAdatascore))])


用特定值进行NA填充:

NAdata2 <- replace_na(data = NAdata, replace = list(grade = x_mean, score = y_mode))

NAdata2


 person    grade score

1      A 5.000000    89

2      B 5.333333    98

3      C 4.000000    89

4      D 7.000000    89


其他数据的预处理方法及缺失值的处理方法,待续 。。。


相关文章
|
11月前
|
存储 数据采集 监控
CDGA\如何建立实现数据治理的效率价值框架:实践案例解析
数据治理是一个持续优化的过程。组织应建立健全的监督与评估机制,定期对数据治理工作进行评估,发现问题及时整改。广东药科大学通过数据全景图和数据监控大屏,实现了对数据治理成果的动态、多维度呈现与监控,为科学管理决策提供了有力支撑。
|
11月前
|
Java
Java中抽象类和接口有什么区别?
本文阐述了Java中抽象类和接口的区别,包括类型扩展、方法/属性访问控制符、方法实现、使用目的等方面的不同,并提供了抽象类和接口的使用示例,以及Java中其他类型的类(普通类、内部类等)的简介。
1535 0
Java中抽象类和接口有什么区别?
|
12月前
|
监控 关系型数据库 MySQL
如何升级mysql的版本
如何升级mysql的版本
1247 2
python tkinter中的锚点(anchor)问题
python tkinter中的锚点(anchor)问题
|
开发者 容器
Echarts饼图实现-今日进度-动态图
构建一个动态旋转的ECharts饼图,包括渐变色和动画效果。初始化ECharts实例,设置图表尺寸和背景,配置标题、颜色、系列数据及自定义渲染。利用`renderItem`绘制弧线和圆点,`getCirlPoint`计算坐标。通过`setInterval`和`draw`函数实现旋转动画。完整代码可在链接下载。
723 0
Echarts饼图实现-今日进度-动态图
|
传感器 物联网 数据挖掘
物联网在智慧城市交通管理系统中的应用
物联网在智慧城市交通管理系统中的应用
478 1
|
算法 计算机视觉
OpenCV(四十五):ORB特征点
OpenCV(四十五):ORB特征点
245 0
|
运维 Kubernetes 供应链
【极狐 GitLab】在 web 端合并分支
【极狐 GitLab】在 web 端合并分支
586 0