R语言 实现将1对多数据与1对1数据互换
更新时间:2021年5月6日 13:51 点击:1520
想了好长时间名字,不知道要解决的问题的名字叫什么,直接上问题demo
问题demo
现在有用户消费金额的数据:
用户 | 日期 | 金额 |
---|---|---|
小明 | 2016-01 | 300 |
小明 | 2016-02 | 500 |
小明 | 2016-03 | 400 |
小刘 | 2016-01 | 700 |
小刘 | 2016-02 | 800 |
小刘 | 2016-03 | 600 |
我将以上数据格式为一对多数据(想不出好名字,敬请大家拍砖)
还有一种数据形式如下,我将如下格式数据称为1对1数据
用户 | 2016-01 | 2016-02 | 2016-03 |
---|---|---|---|
小明 | 300 | 500 | 400 |
小刘 | 700 | 800 | 600 |
如何用R语言实现1对多数据与1对1数据之间的互换,在这里写了一个简单的小函数,大家有好的想法敬请提出。
生成1对1数据集的代码如下:
#创建数据集 c1<-c("小明",300,500,400) c2<-c("小刘",700,800,600) dt<-as.data.frame(rbind(c1,c2)) names(dt)<-c("用户","2016-01","2016-02","2016-03")
1对1数据转成1对多数据
构建1对多数据的转换函数:
##data原始数据集 ##colList要变换的列 ##要保留的主键列 One2More<-function(data,colList,primaryCol){ result=data.frame(NULL) for(r in c(1:nrow(data))){ temp<-as.data.frame(t(data[r,colList])) temp$日期<-row.names(temp) temp<-cbind(temp,data[r,primaryCol]) names(temp)<-c("c1","c2","c3")#临时起的名字,可按自己需求进行修改 #编行号开始,如果没有要求,此步可省略 resultRows<-nrow(result) tempRows<-nrow(temp) row.names(temp)<-c((resultRows+1):(resultRows+tempRows)) #编行号结束 result<-rbind(result,temp) } result; }
执行代码如下:
One2MoreResult<-One2More(dt,c("2016-01","2016-02","2016-03"),"用户")
结果如下图所示:
1对多数据转成1对1数据
针对多转一我们需要安装plyr包,函数如下:
#如果有plyr,请跳过此步安装 install.packages("plyr") library(plyr) ##data:数据集 ##primaryCol:要分组的那一列 ##rowNameCols:想要变成表头的列 More2One<-function(data,primaryCol,rowNameCols){ ddply(data,primaryCol,function(k){colNames<-k[,rowNameCols];row.names(k)<-k[,rowNameCols];k<-k[,-c(which(colnames(k)==rowNameCols | colnames(k)==primaryCol ))];t(k)}) }
注意:如果使用上文中One2MoreResult数据,请注意数据类型,得出的数值结果为因子类型,请先进行转换,转换代码如下:
One2MoreResult$c1<-as.numeric(as.character(One2MoreResult$c1))
此时One2MoreResult的数据如下:
此时要按照c3进行分组,将c2列放在表头去
执行代码如下:
More2OneResult<-More2One(One2MoreResult,"c3","c2")
结果如下图所示:
完整代码
#创建数据集 c1<-c("小明",300,500,400) c2<-c("小刘",700,800,600) dt<-as.data.frame(rbind(c1,c2)) View(dt) names(dt)<-c("用户","2016-01","2016-02","2016-03") ##data原始数据集 ##colList要变换的列 ##要保留的主键列 One2More<-function(data,colList,primaryCol){ result=data.frame(NULL) for(r in c(1:nrow(data))){ temp<-as.data.frame(t(data[r,colList])) temp$日期<-row.names(temp) temp<-cbind(temp,data[r,primaryCol]) names(temp)<-c("c1","c2","c3") #编行号开始,如果没有要求,此步可省略 resultRows<-nrow(result) tempRows<-nrow(temp) row.names(temp)<-c((resultRows+1):(resultRows+tempRows)) #编行号结束 result<-rbind(result,temp) } result; } #如果有plyr,请跳过此步安装 install.packages("plyr") library(plyr) ##data:数据集 ##primaryCol:要分组的那一列 ##rowNameCols:想要变成表头的列 More2One<-function(data,primaryCol,rowNameCols){ ddply(data,primaryCol,function(k){colNames<-k[,rowNameCols];row.names(k)<-k[,rowNameCols];k<-k[,-c(which(colnames(k)==rowNameCols | colnames(k)==primaryCol ))];t(k)}) } One2MoreResult<-One2More(dt,c("2016-01","2016-02","2016-03"),"用户") View(One2MoreResult) One2MoreResult$c1<-as.numeric(as.character(One2MoreResult$c1)) More2OneResult<-More2One(One2MoreResult,"c3","c2") View(More2OneResult)
期望
如果有时间会解决如下问题:
1. 提高代码的通用性
2. 列名或表头名可以通过指定来解决
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。如有错误或未考虑完全的地方,望不吝赐教。
上一篇: R语言关于“包”的知识点总结
下一篇: R语言决策基础知识点详解
相关文章
- 这篇文章主要介绍了R语言作图:坐标轴的设置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了R语言基本画图函数与多图多线的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了R语言-将list转换为向量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了R语言-切换科学计数法和更换小数点位数的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了R语言创建矩阵的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-06
- 在本篇文章里小编给大家分享了一篇关于R语言运算符知识点讲解内容,有兴趣的朋友们可以参考下。...2021-05-06
- 这篇文章主要介绍了R语言中的因子类型详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了R语言-使用快捷键快速注释的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了R语言中quantile()函数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了改变R语言默认存储包的路径操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要给大家总结介绍了R语言导入导出数据的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-06
R语言 install.packages 无法读取索引的解决方案
这篇文章主要介绍了R语言 install.packages 无法读取索引的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06- 在本篇文章里小编给大家分享的是一篇关于R语言“包”的知识点总结内容,有兴趣的朋友们可以学习下。...2021-05-06
- 这篇文章主要给大家介绍了关于R语言逻辑回归、ROC曲线与十折交叉验证的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-06
- 这篇文章主要为大家详细介绍了R语言学习ggplot2绘制统计图形包的全面知识讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-11-06
- 在本篇文章里小编给大家整理的是一篇关于R语言关于随机森林算法的知识点详解内容,有兴趣的朋友们可以跟着学习下。...2021-05-13
- 这篇文章主要介绍了R语言-t分布正态分布分位数图的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了R语言-在一张图上显示多条线的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了R语言开发之CSV文件的读写操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-06