R語(yǔ)言 實(shí)現(xiàn)將1對(duì)多數(shù)據(jù)與1對(duì)1數(shù)據(jù)互換
想了好長(zhǎng)時(shí)間名字,不知道要解決的問(wèn)題的名字叫什么,直接上問(wèn)題demo
問(wèn)題demo
現(xiàn)在有用戶消費(fèi)金額的數(shù)據(jù):
用戶 | 日期 | 金額 |
---|---|---|
小明 | 2016-01 | 300 |
小明 | 2016-02 | 500 |
小明 | 2016-03 | 400 |
小劉 | 2016-01 | 700 |
小劉 | 2016-02 | 800 |
小劉 | 2016-03 | 600 |
我將以上數(shù)據(jù)格式為一對(duì)多數(shù)據(jù)(想不出好名字,敬請(qǐng)大家拍磚)
還有一種數(shù)據(jù)形式如下,我將如下格式數(shù)據(jù)稱為1對(duì)1數(shù)據(jù)
用戶 | 2016-01 | 2016-02 | 2016-03 |
---|---|---|---|
小明 | 300 | 500 | 400 |
小劉 | 700 | 800 | 600 |
如何用R語(yǔ)言實(shí)現(xiàn)1對(duì)多數(shù)據(jù)與1對(duì)1數(shù)據(jù)之間的互換,在這里寫(xiě)了一個(gè)簡(jiǎn)單的小函數(shù),大家有好的想法敬請(qǐng)?zhí)岢觥?/p>
生成1對(duì)1數(shù)據(jù)集的代碼如下:
#創(chuàng)建數(shù)據(jù)集 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對(duì)1數(shù)據(jù)轉(zhuǎn)成1對(duì)多數(shù)據(jù)
構(gòu)建1對(duì)多數(shù)據(jù)的轉(zhuǎn)換函數(shù):
##data原始數(shù)據(jù)集 ##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")#臨時(shí)起的名字,可按自己需求進(jìn)行修改 #編行號(hào)開(kāi)始,如果沒(méi)有要求,此步可省略 resultRows<-nrow(result) tempRows<-nrow(temp) row.names(temp)<-c((resultRows+1):(resultRows+tempRows)) #編行號(hào)結(jié)束 result<-rbind(result,temp) } result; }
執(zhí)行代碼如下:
One2MoreResult<-One2More(dt,c("2016-01","2016-02","2016-03"),"用戶")
結(jié)果如下圖所示:
1對(duì)多數(shù)據(jù)轉(zhuǎn)成1對(duì)1數(shù)據(jù)
針對(duì)多轉(zhuǎn)一我們需要安裝plyr包,函數(shù)如下:
#如果有plyr,請(qǐng)?zhí)^(guò)此步安裝 install.packages("plyr") library(plyr) ##data:數(shù)據(jù)集 ##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數(shù)據(jù),請(qǐng)注意數(shù)據(jù)類(lèi)型,得出的數(shù)值結(jié)果為因子類(lèi)型,請(qǐng)先進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換代碼如下:
One2MoreResult$c1<-as.numeric(as.character(One2MoreResult$c1))
此時(shí)One2MoreResult的數(shù)據(jù)如下:
此時(shí)要按照c3進(jìn)行分組,將c2列放在表頭去
執(zhí)行代碼如下:
More2OneResult<-More2One(One2MoreResult,"c3","c2")
結(jié)果如下圖所示:
完整代碼
#創(chuàng)建數(shù)據(jù)集 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原始數(shù)據(jù)集 ##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") #編行號(hào)開(kāi)始,如果沒(méi)有要求,此步可省略 resultRows<-nrow(result) tempRows<-nrow(temp) row.names(temp)<-c((resultRows+1):(resultRows+tempRows)) #編行號(hào)結(jié)束 result<-rbind(result,temp) } result; } #如果有plyr,請(qǐng)?zhí)^(guò)此步安裝 install.packages("plyr") library(plyr) ##data:數(shù)據(jù)集 ##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)
期望
如果有時(shí)間會(huì)解決如下問(wèn)題:
1. 提高代碼的通用性
2. 列名或表頭名可以通過(guò)指定來(lái)解決
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
R語(yǔ)言關(guān)于變量的知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于R語(yǔ)言關(guān)于變量的知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-03-03R語(yǔ)言數(shù)據(jù)可視化包ggplot2畫(huà)圖之散點(diǎn)圖的基本畫(huà)法
散點(diǎn)圖主要用于描述兩個(gè)連續(xù)變量之間的關(guān)系,通過(guò)散點(diǎn)圖發(fā)現(xiàn)變量之間的相關(guān)性強(qiáng)度、是否存在線性關(guān)系等,下面這篇文章主要給大家介紹了關(guān)于R語(yǔ)言數(shù)據(jù)可視化包ggplot2畫(huà)圖之散點(diǎn)圖的基本畫(huà)法,需要的朋友可以參考下2022-11-11R語(yǔ)言編程重讀微積分泰勒級(jí)數(shù)示例詳解
這篇文章主要為大家介紹了R語(yǔ)言編程重讀微積分泰勒級(jí)數(shù)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10R語(yǔ)言關(guān)于協(xié)方差分析實(shí)例分析
在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于R語(yǔ)言關(guān)于協(xié)方差分析實(shí)例分析內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05R語(yǔ)言-如何將循環(huán)所得的矩陣組成一個(gè)矩陣
這篇文章主要介紹了R語(yǔ)言實(shí)現(xiàn)將循環(huán)所得的矩陣組成一個(gè)矩陣的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04詳解R語(yǔ)言中的表達(dá)式、數(shù)學(xué)公式、特殊符號(hào)
這篇文章主要介紹了詳解R語(yǔ)言中的表達(dá)式、數(shù)學(xué)公式、特殊符號(hào),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03R語(yǔ)言服務(wù)器安裝R包實(shí)現(xiàn)過(guò)程
這篇文章主要為大家介紹了R語(yǔ)言在服務(wù)器安裝R包的實(shí)現(xiàn)過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11R語(yǔ)言繪圖數(shù)據(jù)可視化pie?chart餅圖
這篇文章主要介紹了R語(yǔ)言繪圖數(shù)據(jù)可視化pie?chart餅圖,教大家如何用R語(yǔ)言來(lái)畫(huà)大餅,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02