在实际应用中长宽矩阵转换运用广泛,网络上资料也很繁多,但很少见简洁明了的将其应用展示清楚,本文根据实际使用,将长宽矩阵举例说明。

上图左边是长数据(针对type列),右图是将pop转换后的宽数据,这种长宽数据变化在我们数据处理中非常常见。使用比较久的就是 reshape2 包(现在新包 tidyr 更方便,本文以常用的 reshape2 为主 tidyr 此处不在赘述)

reshape2主要有两个应用函数:

  • melt:可以将宽数据转化为长数据
  • cast:可以将长数据转化为宽数据

1)宽数据转换长数据

我们用系统自带的airquality数据集做测试,如下为一个宽数据

用melt将其转化为长数据,如果我们没有指定将那几个指定为变量,默认将所有的列作为变量

我们也可以选择几个作为变量来整合剩下的为长数据

这里我们看到用”Month”, “Day”作为变量(可以认为是保留列),剩下的几列都将整合到列名:climate_variable,对应的值到:climate_value

2)长数据转宽数据

https://seananderson.ca/2013/10/19/reshape/

实际应用中,我们在合并数据时可能遇到各种情况,下面给大家一个通用解决方案:

dcast(
    data,
    # 参考上面的方法定义
    V1 ~ V2,
    # 对于缺失部分定义
    fill = "-",
    # 对于合并时,存在多个重复值时处理方案,此处是用合并的方式处理
    fun.aggregate = function(x) {
        paste0(x, collapse = ";")
    }
)

最后提一句, tidyr 在长宽数据处理上更便捷,可以看下官方的学习卡片:

参考资料:

1.https://tidyr.tidyverse.org/

2.http://had.co.nz/reshape/

3.https://seananderson.ca/2013/10/19/reshape/