数据录入与格式转换(reshape2、tidyr包)
2020-03-23 本文已影响0人
谢俊飞
在实验数据产出之后,绘制图形时存在两个问题,首先是数据录入格式的问题,其次是数据转换的问题。
(一):数据录入[1]
举例:用两种饲料喂食橘小实蝇(处理),4个生物重复,待其性成熟后每日统计产卵量,连续统计4天,试录入数据。
1.1 宽数据格式
宽数据是指数据集对所有的变量进行了明确的细分,各变量的值不存在重复循环的情况也无法归类。数据总体的表现为变量多而观察值少。
1.2 长数据格式
长数据一般是指数据集中的变量没有做明确的细分,即变量中至少有一个变量中的元素存在值严重重复循环的情况(可以归为几类),表格整体的形状为长方形,即 变量少而观察值多。
(二):数据转换
2.1 reshape2包
Reshape包主要是用来做数据变形的。其中主要的有两个函数melt和dcast1。其中melt主要用于宽变长,而dcast1主要用于长变宽。
2.1.1 宽格式转长格式[2]
# 数组(array)类型
datax <- array(1:8, dim=c(2,2,2))
melt(datax)
# 列表数据
melt(data, id.vars, measure.vars,
variable.name = "variable", ..., na.rm = FALSE,
value.name = "value")
- id.vars 是被当做维度的列变量,每个变量在结果中占一列;
- measure.vars 是被当成观测值的列变量,它们的列变量名称和值分别组成 variable 和 value两列;
- 列变量名称用variable.name 和 value.name来指定。
var.ids 可以写成id,measure.vars可以写成measure。id(即var.ids)和观测值(即measure.vars)这两个参数可以只指定其中一个,剩余的列被当成另外一个参数的值;如果两个都省略,数值型的列被看成观测值,其他的被当成id。如果想省略参数或者去掉部分数据,参数名最好用 id/measure,否则得到的结果很可能不是你要的。
2.1.2 长格式转宽格式[3]
- dcast:针对数据框
- acast:针对向量、矩阵、数组
dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL,subset = NULL,
fill = NULL, drop = TRUE,value.var = guess_value(data))
- data:以溶解的数据框(通常是melt函数创建的);
- formula:描述输出结果的公式,比如x~y,则x表示数据透视表的行,y代表数据透视表的列;
- fun.aggregate:聚合函数。如果要聚合输出结果中一溶解的数据,用这个参数可以设置聚合函数。可以使用自定义函数;
- margins:相当于透视表中的行总计和列总计;
- subset:选取满足一些特定值的数据,相当于Excel透视表的筛选。例如, subset =.(variable ==“length”);
- value.var:存储值的列的名称。
2.2 tidyr包[4][5]
tidyr主要提供了一个类似Excel中数据透视表(pivot table)的功能;
gather和spread函数将数据在长格式和宽格式之间相互转化,应用在比如稀疏矩阵和稠密矩阵之间的转化;
2.2.1 宽格式转长格式
# gather的用法
gather(data, key, value, …, na.rm = FALSE, convert = FALSE)
- data:需要被转换的宽形表;
- key:将原数据框中的所有列赋给一个新变量key;
- value:将原数据框中的所有值赋给一个新变量value…:可以指定哪些列聚到同一列中;
- ...:包含值的源列的名称;
- na.rm:是否删除缺失值;
- convert=FALSE:是否需要进行类型转换;
- factor_key=FALSE:是否存储为字符向量,否则存储为因子,按照原始顺序排列。
2.2.2 长格式转宽格式[5]
# spread的用法:
spread(data, key, value, fill = NA, convert = FALSE, drop =TRUE,
sep = NULL)
- data:为需要转换的长形表;
- key:需要将变量值拓展为字段的变量;
- value:需要分散的值;
- fill:对于缺失值,可将fill的值赋值给被转型后的缺失值。
(三):数据演示[6]
3.1 数据录入
# 在宽格式和长格式之间转换数据
rm(list = ls())
olddata_wide <- read.table(header=TRUE, text='
subject sex control cond1 cond2
1 M 7.9 12.3 10.7
2 F 6.3 10.6 11.1
3 F 9.5 13.1 13.8
4 M 11.5 13.4 12.9
')
# Make sure the subject column is a factor
olddata_wide$subject <- factor(olddata_wide$subject)
olddata_long <- read.table(header=TRUE, text='
subject sex condition measurement
1 M control 7.9
1 M cond1 12.3
1 M cond2 10.7
2 F control 6.3
2 F cond1 10.6
2 F cond2 11.1
3 F control 9.5
3 F cond1 13.1
3 F cond2 13.8
4 M control 11.5
4 M cond1 13.4
4 M cond2 12.9
')
# Make sure the subject column is a factor
olddata_long$subject <- factor(olddata_long$subject)
3.2 数据转换
##################################宽数据转换####################################
olddata_wide
# tidyr package
library(tidyr)
data_long <- gather(data = olddata_wide, key = condition,
value = measurement, control:cond2, factor_key = TRUE)
data_long
# reshape2 package
library(reshape2)
data_long <- melt(data = olddata_wide, id.vars=c("subject", "sex"),
measure.vars= c("control","cond1","cond2"),
variable.name = "variable", value.name = "value")
data_long
# 可以简写为 melt(olddata_wide, id.vars=c("subject", "sex"))
##################################长数据转换####################################
olddata_long
# tidyr package
library(tidyr)
data_wide <- spread(data = olddata_long, key = condition, value = measurement)
data_wide
# reshape2 package
library(reshape2)
data_wide <- dcast(data = olddata_long, formula = subject + sex ~ condition,
value.var="measurement")
data_wide
参考资料: