数据处理 | 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


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


相关文章
|
20天前
|
机器学习/深度学习 存储 分布式计算
机器学习PAI关于maxcompute上用protobuf 处理数据,比较方便的方式
机器学习PAI关于maxcompute上用protobuf 处理数据,比较方便的方式
|
14天前
|
SQL 分布式计算 关系型数据库
【数据采集与预处理】数据传输工具Sqoop
【数据采集与预处理】数据传输工具Sqoop
25 0
|
15天前
|
消息中间件 数据采集 分布式计算
【数据采集与预处理】数据接入工具Kafka
【数据采集与预处理】数据接入工具Kafka
33 1
【数据采集与预处理】数据接入工具Kafka
|
15天前
|
数据采集 分布式计算 Java
【数据采集与预处理】流数据采集工具Flume
【数据采集与预处理】流数据采集工具Flume
46 8
|
20天前
|
SQL 机器学习/深度学习 数据可视化
Pandas与其他库的集成:构建强大的数据处理生态
【4月更文挑战第16天】Pandas在数据处理中扮演关键角色,但与其他Python库如NumPy、Matplotlib/Seaborn、Scikit-learn和SQL的集成使其功能更加强大。结合NumPy进行数值计算,搭配Matplotlib/Seaborn实现高效可视化,与Scikit-learn联用加速机器学习,以及与SQL集成便于数据库操作,这些都构建了一个全面的数据处理生态系统,提升了数据科学家的工作效率,助力于数据价值的发掘。
|
20天前
|
数据可视化 API 数据库
R包:disgenet2r|DisGeNET的懒癌福利,一行代码多种可视化
DisGeNET是一个综合性的数据库,包含大量关于人类基因和疾病关联的信息,常用于生物信息学和基因组学研究。disgenet2r是R语言工具,方便用户访问和分析DisGeNET数据。用户需注册DisGeNET账号并安装R包,通过disgenet2r包可查询、检索基因-疾病关联和变异-疾病关联数据。目前DisGeNET包含超过110万个基因-疾病关联和30万个变异-疾病关联。使用示例包括查询特定疾病相关基因和多疾病联合分析。
28 0
|
20天前
|
存储 数据挖掘 物联网
Python中的实时数据分析:构建流处理应用程序
【4月更文挑战第12天】本文介绍了Python在实时数据分析中的应用,包括实时数据分析的基本概念、Python的优势及基本流程。Python凭借丰富的库(如Pandas、NumPy)、强大的数据处理工具(如PySpark、Apache Kafka)和活跃的生态系统,成为实时数据分析的理想选择。文中通过社交媒体和物联网的数据分析案例展示了Python如何从数据获取、预处理、处理、存储到结果展示的全过程。通过学习和实践,读者可以掌握使用Python进行实时数据分析的技能。
|
20天前
|
消息中间件 监控 安全
【天衍系列 05】Flink集成KafkaSink组件:实现流式数据的可靠传输 & 高效协同
【天衍系列 05】Flink集成KafkaSink组件:实现流式数据的可靠传输 & 高效协同
84 5
|
20天前
|
存储 编译器 API
高性能收发原始数据包的框架(Netmap)
高性能收发原始数据包的框架(Netmap)
|
7月前
|
JSON 监控 安全
处理大规模数据流:使用Java编写公司聊天监控软件的数据处理模块
在今天的数字时代,企业越来越依赖聊天公司监控软件来确保员工的上网安全、保护敏感信息,并监测内部通信。为了更有效地处理和分析这些大规模数据流,公司通常需要自定义的数据处理模块。在本文中,我们将探讨如何使用Java编写这样的模块,同时确保跨平台部署。
177 0

热门文章

最新文章