R语言与统计分析

数据录入与格式转换(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(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

参考资料:


  1. R语言数据格式 长数据 和 宽数据 之间的转换

  2. reshape/reshape2 包的melt函数

  3. 利用reshape2包进行数据逆透视和数据透视

  4. tidyr包:reshape2的替代者,功能更纯粹

  5. R语言tidyr包数据变换函数

  6. Converting data between wide and long format

上一篇下一篇

猜你喜欢

热点阅读