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


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


相关文章
|
8月前
|
机器学习/深度学习 存储 分布式计算
机器学习PAI关于maxcompute上用protobuf 处理数据,比较方便的方式
机器学习PAI关于maxcompute上用protobuf 处理数据,比较方便的方式
|
8月前
|
数据采集 自然语言处理 监控
|
1月前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
3月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
6月前
|
消息中间件 存储 Java
使用Java构建实时数据处理流程
使用Java构建实时数据处理流程
|
5月前
|
存储 算法 数据处理
|
5月前
|
机器学习/深度学习 数据采集 数据可视化
构建高效的数据管道:使用Python进行数据处理和分析
【8月更文挑战第24天】在信息爆炸的时代,数据是新的石油。本文将引导你如何利用Python构建一个高效的数据管道,从数据的获取、清洗到分析,最后实现可视化。我们将探索pandas、NumPy、matplotlib等库的强大功能,并通过实际案例加深理解。无论你是数据科学新手还是希望提升数据处理技能的开发者,这篇文章都将为你提供宝贵的洞见和实用技巧。
|
7月前
|
机器学习/深度学习 分布式计算 数据可视化
使用Python进行大规模数据处理和分析
总而言之,Python作为一种强大而灵活的编程语言,在大规模数据处理和分析领域有着广泛的应用。通过不断学习和探索,我们可以充分发挥Python的潜力,为解决现实世界的数据挑战做出更大的贡献。让我们继续深入学习、探索和创造,在数据科学的道路上不断前行!
|
7月前
|
分布式计算 Hadoop 数据处理
Python进行大规模数据处理
【6月更文挑战第15天】 Hadoop基于MapReduce,适合大规模数据存储,但处理速度较慢;Spark则利用内存计算,速度更快,支持PySpark接口。Spark还提供DataFrame和SQL,简化编程。两者各有生态,Spark在实时处理和机器学习上有优势。Python案例展示了MapReduce日志分析和Spark的线性回归模型训练。未来,大数据处理将持续演进,Python将继续扮演关键角色。
53 5
|
6月前
|
存储 消息中间件 数据挖掘
Python实时数据分析:利用丰富的库(如Pandas, PySpark, Kafka)进行流处理,涵盖数据获取、预处理、处理、存储及展示。
【7月更文挑战第5天】Python实时数据分析:利用丰富的库(如Pandas, PySpark, Kafka)进行流处理,涵盖数据获取、预处理、处理、存储及展示。示例代码展示了从Kafka消费数据,计算社交媒体活跃度和物联网设备状态,并可视化结果。适用于监控、故障检测等场景。通过学习和实践,提升实时数据分析能力。
158 0