行列互转问题
先前总结过用MySQL解决行列互转问题的基本思路:
https://www.jianshu.com/p/5e1fdd34a739 [2022-10-07-mysql学习]行列互转问题
最近打算认真学学tidyR,发现用R解决这个问题非常高效。
示例数据
id | revenue | month |
---|---|---|
1 | 8000 | Jan |
2 | 9000 | Jan |
3 | 1000 | Feb |
1 | 7000 | Feb |
1 | 6000 | Mar |
数据集department
行转列
new_department<-spread(department,key=month,value=revenue)
new_department
运行结果:
id | Feb | Jan | Mar |
---|---|---|---|
1 | 7000 | 8000 | 6000 |
2 | NA | 9000 | NA |
3 | 1000 | NA | NA |
列转行
gather(new_department,key=month,value=revenue,-id)
运行结果:
id | month | revenue |
---|---|---|
1 | Feb | 7000 |
2 | Feb | NA |
3 | Feb | 1000 |
1 | Jan | 8000 |
2 | Jan | 9000 |
3 | Jan | NA |
1 | Mar | 6000 |
2 | Mar | NA |
3 | Mar | NA |
通过na.rm参数去除NA值:
gather(new_department,key=month,value=revenue,-id,na.rm=TRUE)
运行结果:
id | month | revenue |
---|---|---|
1 | Feb | 7000 |
3 | Feb | 1000 |
1 | Jan | 8000 |
2 | Jan | 9000 |
1 | Mar | 6000 |
附注
示例数据原本的形式又被称为整洁格式或长数据,而行转列后的数据则被称为宽松格式或宽数据,前者是与tidy R适配度更高的数据格式,但后者也有结构清晰、便于记录等优点。