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"),"用户")

结果如下图所示:

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. 列名或表头名可以通过指定来解决

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

(0)

相关推荐

  • R语言 数据集行列互换的技巧分享

    现在给大家介绍的数据处理技巧是长转宽,也就相当于Excel中的转置,不过用R语言实现的长转宽还有数据合并的功能,自然比Excel强大多了. 这里给大家介绍4个函数,其中melt().dcast()来自reshape2包,gather().spread()来自tidyr包 一.宽转长--melt().gather() mydata<-data.frame( name=c("store1","store2","store3","sto

  • R语言求一行(列表、list)数据的平均数操作

    R语言求一个列表的平均数可以使用mean() : mean英文意思有平均数的含义 x=c(1,3,5,7,9) max(x) #这样即可求得平均数为 : 5 假如读取过一个csv文件之后,要求其中一行数据中指定某个区间内的平均数可以使用rowMeans() data = read.csv("input.csv",sep=",",header=T) rowMeans(data[10:17]) 补充:R语言-数据框分组求平均值 [技术关键] 1.从excel把数据读到数

  • R语言数据类型和对象深入讲解

    以上数据类型均为原子向量. 单引号和双引号不做区分. R语言中TRUE和FALSE 可以简化为T和F 多元素向量的生成方式 方式 1:使用c()函数 ,这个是最常见的 c(combine) 如果基本类型混合的话,会强制类型转换 方式2: 使用seq()函数 (创建等差数列) 方式3:创建等差序列 事先知道向量的类型和长度,可以 产生随机数列 有放回抽样 (这个可以用np.random.choice()实现) 取向量的元素,并对其操作 (下表从1开始) 根据变量的不同,R语言数据对象可以分为 到此

  • R语言 实现两表连接且输出不重复数据

    在做项目中遇到了如此问题,其中整理的结果表中没有会员ID信息,只有会员电话号码信息,且每一行为唯一一个会员. 另外一张member表中包含会员ID以及会员电话信息,但是这张表有重复的会员信息,也就是说一个会员在member表中多次出现,memeber表比整理的表要大很多. 说明: 1.在项目过程中,数据量较大,用到的是data.table包,需要用到SQL中的语句减少代码量,因此需要sqldf包. 2.以下例子中xx中的a1在yy中都有对应的值. 3.yy中的a1与b是一一对应的关系,不存在同一

  • R语言 实现将数据框中的字符类型数字转换为数值

    场景1 我现在有一个数据框datexpr,里面的数字都是以字符型表示的,像这样 > datexpr[1,1] [1] " 1.143773961" 现在我想把这个数据框中的字符型数字全部转为数值型数字 使用下面语句即可 datexpr2=as.data.frame(lapply(datexpr,as.numeric)) 现在再次查看,就是数值型啦,整个数据框中的内容也都是数值型的啦 > datexpr2[1,1] [1] 1.143774 场景2 我现在有一个数据框date

  • R语言 数据表匹配和拼接 merge函数的使用

    R中的merge函数类似于Excel中的Vlookup,可以实现对两个数据表进行匹配和拼接的功能. merge(x, y, by = intersect(names(x), names(y)), by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all, sort = TRUE, suffixes = c(".x",".y"), incomparables = NULL, ...) x,y:用于合并的两个

  • R语言数据类型知识点总结

    通常,在使用任何编程语言进行编程时,您需要使用各种变量来存储各种信息. 变量只是保留值的存储位置. 这意味着,当你创建一个变量,你必须在内存中保留一些空间来存储它们. 您可能想存储各种数据类型的信息,如字符,宽字符,整数,浮点,双浮点,布尔等.基于变量的数据类型,操作系统分配内存并决定什么可以存储在保留内存中. 与其他编程语言(如 C 中的 C 和 java)相反,变量不会声明为某种数据类型. 变量分配有 R 对象,R 对象的数据类型变为变量的数据类型.尽管有很多类型的 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

  • R语言rhdf5读写hdf5并展示文件组织结构和索引数据

    前言 h5只是一种简单的数据组织格式[层级数据存储格式(HierarchicalDataFormat:HDF)],该格式被设计用以存储和组织大量数据. 在一些单细胞文献中,作者通常会将分析的数据上传到GEO数据库保存为.h5格式文件,而不是我们常见的工程文件(rds文件,表格数据等),所以为了解析利用这些数据需要对hdf5格式的组织结构有一定的了解. (注:在Seurat包中有现成的函数Seurat::Read10X_h5()可以用来提取表达矩阵,但似乎此外无法从h5文件中提取更多的信息). G

  • R语言的数据输入深入讲解

    既然了解了R语言的基本数据类型,那么如何将庞大的数据送入R语言进行处理呢?送入的数据又是如何在R语言中进行存储的呢?处理这些数据的方法又有那些呢?下面我们一起来探讨一下. 首先,数据输入最直接最直观的方法就是键盘输入,在上面几篇都已经讲到,利用c创建向量,利用matrix创建矩阵,利用data.frame创建数据框等,但是我们处理的数据往往比较多,键盘输入在面对如此庞大的数据时显然不现实,当然你可以花费好几天来输入数据而且保证不出错除外,而且待处理的一般都存储在Excel,网页,数据库其他中介中

  • R语言 UTF-8各种问题的解决方案

    R语言在碰到读UTF-8文件,或者处理UTF-8数据时总是会遇到各种各样的问题,本姑娘也是在碰了n多次壁,被气得吐血好多次之后,终于对这类总结出了一些解决办法: 1. 读UTF-8文件,例如UTF-8格式的csv: 最好的处理办法就是: a1=read.table('C:\\test11.csv',sep=',',fileEncoding = 'UTF-8',header = F) 如果使用如下方法可能会出错(全是血泪教训啊): a2=read.csv('C:\\test11.csv',file

  • R语言-如何读写带分隔符的文件

    有众多的格式和文本文件标准可用于存储数据.用于存储数据的通用格式为分隔符值(即CSV或制表符分割文件).可扩展标记语言(XML).JavaScript对象表示法(JSON) 将数据存储在文本文件中的主要优点是:他们可被几乎所有的其他数据分析软件或人读取 R语言提供丰富的函数来读取不同格式的数据,包括: 文本文件(TXT文件) 逗号分隔文件(CSV文件) TXT文件--read.table() 矩形(类似电子表格的)数据通常存储在带有分隔符的文件中,特别是逗号分隔值(CSV)和制表符分隔值文件.r

  • R语言通过parallel包实现多线程运行方式

    总的来说,R的运算速度不算快,不过类似并行运算之类的改进可以提高运算的性能.下面非常简要地介绍如何利用R语言进行并行运算 library(parallel) cl.cores <- detectCores() cl <- makeCluster(cl.cores) detectCores( )检查当前电脑可用核数. makeCluster(cl.cores)使用刚才检测的核并行运算.R-Doc里这样描述makeCluster函数:Creates a set of copies of R run

  • R语言常见面试题整理

    尊敬的读者,这些R语言面试题是专门设计的,以便您应对在R语言相关面试中可能会被问到的问题. 根据我的经验,良好的面试官几乎不打算在你的面试中问任何特定的问题,通常都是以如下的问题为开端进一步展开后继的问题. 什么是R语言编程? R语言是一种用于统计分析和为此目的创建图形的编程语言.不是数据类型,它具有用于计算的数据对象.它用于数据挖掘,回归分析,概率估计等领域,使用其中可用的许多软件包. R语言中的不同数据对象是什么? 它们是R语言中的6个数据对象.它们是向量,列表,数组,矩阵,数据框和表. 什

  • R语言列筛选的方法select实例详解

    目录 前言 1. 数据描述 2. 使用R语言默认的方法:列选择 3. tidyverse的rename函数 4. tidyverse的select函数 5. select函数注意事项 5.1 绝对引用函数 5.2 放到环境变量中 6. 提取h开头的列 7. 提取因子和数字的列 总结 前言 我们知道,R语言学习,80%的时间都是在清洗数据,而选择合适的数据进行分析和处理也至关重要,如何选择合适的列进行分析,你知道几种方法? 如何优雅高效的选择合适的列,让我们一起来看一下吧. 1. 数据描述 数据来

  • 简述:我为什么选择Python而不是Matlab和R语言

    做数据分析.科学计算等离不开工具.语言的使用,目前最流行的数据语言,无非是MATLAB,R语言,Python这三种语言,但今天小编简单总结了python语言的一些特点及平常使用的工具等. 为什么Python比MATLAB.R语言好呢? 其实,这三种语言都很多数据分析师在用,但更推荐python,主要是有以下几点: 1.python易学.易读.易维护,处理速度也比R语言要快,无需把数据库切割: 2.python势头猛,众多大公司需要,市场前景广阔:而MATLAB语言比较局限,专注于工程和科学计算方

  • Python与R语言的简要对比

    数据挖掘技术日趋成熟和复杂,随着互联网发展以及大批海量数据的到来,之前传统的依靠spss.SAS等可视化工具实现数据挖掘建模已经越来越不能满足日常需求,依据美国对数据科学家(data scientist)的要求,想成为一名真正的数据科学家,编程实现算法以及编程实现建模已经是必要条件:目前很多从事数据挖掘工作的人,大多都是出身非计算机专业,本身对编程基础比较低,所以找到一门快速上手而又高效的编程语言是至关重要的,好的工具和编程语言可以起到事半功倍的效果. 目前在数据挖掘算法方面用的最多的编程语言有

随机推荐