服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - R语言 - R语言 实现将1对多数据与1对1数据互换

R语言 实现将1对多数据与1对1数据互换

2022-01-03 20:28huanbia R语言

这篇文章主要介绍了R语言 实现将1对多数据与1对1数据互换的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

想了好长时间名字,不知道要解决的问题的名字叫什么,直接上问题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"),"用户")

结果如下图所示:

R语言 实现将1对多数据与1对1数据互换

 

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的数据如下:

R语言 实现将1对多数据与1对1数据互换

此时要按照c3进行分组,将c2列放在表头去

执行代码如下:

More2OneResult<-More2One(One2MoreResult,"c3","c2")

结果如下图所示:

R语言 实现将1对多数据与1对1数据互换

 

完整代码

#创建数据集
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. 列名或表头名可以通过指定来解决

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/huanbia/article/details/52846280

延伸 · 阅读

精彩推荐
  • R语言基于R/RStudio中安装包“无法与服务器建立连接”的解决方案

    基于R/RStudio中安装包“无法与服务器建立连接”的解决方案

    这篇文章主要介绍了基于R/RStudio中安装包“无法与服务器建立连接”的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    truffle52815052022-01-05
  • R语言R语言实现支持向量机SVM应用案例

    R语言实现支持向量机SVM应用案例

    本文主要介绍了R语言实现支持向量机SVM应用案例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    一天_pika5222022-01-18
  • R语言R语言gsub替换字符工具的具体使用

    R语言gsub替换字符工具的具体使用

    这篇文章主要介绍了R语言gsub替换字符工具的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    lztttao10372021-12-24
  • R语言R语言中qplot()函数的用法说明

    R语言中qplot()函数的用法说明

    这篇文章主要介绍了R语言中qplot()函数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Jack_丁明12752022-01-05
  • R语言R语言读取xls与xlsx格式文件过程

    R语言读取xls与xlsx格式文件过程

    这篇文章主要为大家介绍了使用R语言读取xls与xlsx格式文件的过程步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪...

    Kanny广小隶11982022-01-20
  • R语言R语言中的vector(向量),array(数组)使用总结

    R语言中的vector(向量),array(数组)使用总结

    这篇文章主要介绍了R语言中的vector(向量),array(数组)使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    A叶子叶来5772021-11-14
  • R语言如何用R语言绘制散点图

    如何用R语言绘制散点图

    这篇文章主要介绍了如何用R语言绘制散点图,帮助大家更好的理解和学习使用R语言,感兴趣的朋友可以了解下...

    菜鸟教程13002021-12-23
  • R语言R语言常量知识点总结

    R语言常量知识点总结

    在本篇文章里小编给大家整理了一篇关于R语言常量知识点总结内容,有兴趣的朋友们可以学习分享下。...

    R语言教程网12102021-12-29