R語言 數(shù)據(jù)集行列互換的技巧分享
現(xiàn)在給大家介紹的數(shù)據(jù)處理技巧是長轉(zhuǎn)寬,也就相當(dāng)于Excel中的轉(zhuǎn)置,不過用R語言實(shí)現(xiàn)的長轉(zhuǎn)寬還有數(shù)據(jù)合并的功能,自然比Excel強(qiáng)大多了。
這里給大家介紹4個函數(shù),其中melt()、dcast()來自reshape2包,gather()、spread()來自tidyr包
一、寬轉(zhuǎn)長——melt()、gather()
mydata<-data.frame( name=c("store1","store2","store3","store4"), address=c("普陀區(qū)","黃浦區(qū)","徐匯區(qū)","浦東新區(qū)"), sale2014=c(3000,2500,2100,1000), sale2015=c(3020,2800,3900,2000), sale2016=c(5150,3600,2700,2500), sale2017=c(4450,4100,4000,3200) ) #寬轉(zhuǎn)長——melt mydata1<-melt( mydata, id.vars=c("address","name"),#要保留的主字段 variable.name = "Year",#轉(zhuǎn)換后的分類字段名稱(維度) value.name = "Sale" #轉(zhuǎn)換后的度量值名稱 )
輸出結(jié)果
> mydata1<-melt( + mydata, + id.vars=c("address","name"),#要保留的主字段 + variable.name = "Year",#轉(zhuǎn)換后的分類字段名稱(維度) + value.name = "Sale" #轉(zhuǎn)換后的度量值名稱 + ) > mydata1 address name Year Sale 1 普陀區(qū) store1 sale2014 3000 2 黃浦區(qū) store2 sale2014 2500 3 徐匯區(qū) store3 sale2014 2100 4 浦東新區(qū) store4 sale2014 1000 5 普陀區(qū) store1 sale2015 3020 6 黃浦區(qū) store2 sale2015 2800 7 徐匯區(qū) store3 sale2015 3900 8 浦東新區(qū) store4 sale2015 2000 9 普陀區(qū) store1 sale2016 5150 10 黃浦區(qū) store2 sale2016 3600 11 徐匯區(qū) store3 sale2016 2700 12 浦東新區(qū) store4 sale2016 2500 13 普陀區(qū) store1 sale2017 4450 14 黃浦區(qū) store2 sale2017 4100 15 徐匯區(qū) store3 sale2017 4000 16 浦東新區(qū) store4 sale2017 3200
再來看看gather()函數(shù)怎么用
> #寬轉(zhuǎn)長——gather > mydata1<-tidyr::gather( + data=mydata, + key="Year", + value="sale", + sale2014:sale2017 + ) > mydata1 name address Year sale 1 store1 普陀區(qū) sale2014 3000 2 store2 黃浦區(qū) sale2014 2500 3 store3 徐匯區(qū) sale2014 2100 4 store4 浦東新區(qū) sale2014 1000 5 store1 普陀區(qū) sale2015 3020 6 store2 黃浦區(qū) sale2015 2800 7 store3 徐匯區(qū) sale2015 3900 8 store4 浦東新區(qū) sale2015 2000 9 store1 普陀區(qū) sale2016 5150 10 store2 黃浦區(qū) sale2016 3600 11 store3 徐匯區(qū) sale2016 2700 12 store4 浦東新區(qū) sale2016 2500 13 store1 普陀區(qū) sale2017 4450 14 store2 黃浦區(qū) sale2017 4100 15 store3 徐匯區(qū) sale2017 4000 16 store4 浦東新區(qū) sale2017 3200
和melt()函數(shù)不同,gather()函數(shù)需要指定關(guān)鍵字段key,以及關(guān)鍵字段對應(yīng)的值value,但是gather()函數(shù)更加好理解。
二、長轉(zhuǎn)寬——dcast()和spread()
還是用上面的data1數(shù)據(jù)集,先來看看dcast()函數(shù)
#長轉(zhuǎn)寬——dcast dcast( data=mydata1, name+address~Year #左側(cè)是要保留的字段,右側(cè)是要分割的分類變量,列數(shù)等于表達(dá)式 #右側(cè)分類變量的類別個數(shù) )
> #長轉(zhuǎn)寬——dcast > dcast( + data=mydata1, + name+address~Year + #左側(cè)是要保留的字段,右側(cè)是要分割的分類變量,列數(shù)等于表達(dá)式 + #右側(cè)分類變量的類別個數(shù) + ) Using sale as value column: use value.var to override. name address sale2014 sale2015 sale2016 sale2017 1 store1 普陀區(qū) 3000 3020 5150 4450 2 store2 黃浦區(qū) 2500 2800 3600 4100 3 store3 徐匯區(qū) 2100 3900 2700 4000 4 store4 浦東新區(qū) 1000 2000 2500 3200
dcast()函數(shù)的使用規(guī)則需要琢磨下才能理解,大家好好看看注釋部分,再來看看spread()
#長轉(zhuǎn)寬——spread tidyr::spread( data=mydata1, key=Year, value=sale )
> #長轉(zhuǎn)寬——spread > tidyr::spread( + data=mydata1, + key=Year, + value=sale + ) name address sale2014 sale2015 sale2016 sale2017 1 store1 普陀區(qū) 3000 3020 5150 4450 2 store2 黃浦區(qū) 2500 2800 3600 4100 3 store3 徐匯區(qū) 2100 3900 2700 4000 4 store4 浦東新區(qū) 1000 2000 2500 3200
直接調(diào)用tidyr::spread,需要指定關(guān)鍵字段key和對應(yīng)的值value。
但是從理解上來看,我個人更喜歡tidyr包的函數(shù),使用很清晰,大家可以根據(jù)實(shí)際情況自行選擇,好啦,今天的分享結(jié)束,下次再見!
補(bǔ)充:利用R語言對數(shù)據(jù)行列轉(zhuǎn)制
使用軟件:R語言,mysql
使用系統(tǒng):ubuntu16.04
使用效果前后對比:
使用前
x1 | x2 | y |
---|---|---|
a | A | 1 |
b | B | 2 |
c | C | 3 |
a | A | 4 |
使用后(里面的數(shù)值可以進(jìn)行多種變換,主要是把x1,x2改為他們的交叉表)
A | B | C | |
---|---|---|---|
a | 5(1+4) | NA | NA |
b | NA | 2 | NA |
c | NA | NA | 3 |
1.R語言與mysql的數(shù)據(jù)庫連接
下載RMysql(由于我使用的是ubuntu,所以使用RMysql):
install.packages("RMySQL")
加載所需要的程輯包:
library(RMySQL)
將mysql數(shù)據(jù)導(dǎo)入R:
con<-dbConnect(MySQL(),dbname="database_name",user="user_name",password="password")
導(dǎo)入后,所得數(shù)據(jù)類型是數(shù)據(jù)框(data.frame)
對于RMySQL這個包,比較重要的語句有這幾個:
summary(con) : 用于查看con對應(yīng)的mysql信息
dbListTables(con) :用于查看con中的所有table
dbRemoveTable(con,”table_name”)
dbReadTable(con,”table_name”)
dbWriteTable(con,”table_name”,value) 其中value類型需要為數(shù)據(jù)框
2.在R中實(shí)現(xiàn)數(shù)據(jù)變換
我們使用以上的語句,讀取所需要變換的表
data=dbReadTable(con,"table_name")
然后使用一個重要的函數(shù):tapply()
注意,我下面使用的是我之前舉例所用的表
data2=tapply(data\$y,list(data\$x1,data$x2),sum)
對于tapply(x,list(a,b),fac)
a和b是形成交叉表的行列表頭
而x則是取值,我們當(dāng)然可以不使用data里面的值當(dāng)作x
fac則是對x進(jìn)行的函數(shù)運(yùn)算,比如使用sum,就是將相同的x1,x2的y相加
3.將數(shù)據(jù)導(dǎo)回mysql
上面我們已經(jīng)把數(shù)據(jù)變換為想要的表格形式了,不過,使用了tapply后,data2的類會變?yōu)榫仃?matrix),要想知道數(shù)據(jù)類型,在R中使用class()便可以查看,而我們所使用的RMySQL包將r中數(shù)據(jù)寫入mysql是需要用數(shù)據(jù)框的,所以我們要轉(zhuǎn)換矩陣為數(shù)據(jù)框,那么要怎么做呢,很簡單
data3=data.frame(data2)
這樣,我們的data3便是一個數(shù)據(jù)框了,使用語句
dbWriteTable(con,test,data3)
便寫入了一個table于mysql,名字叫做test,數(shù)據(jù)值為data3.
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
R語言編程數(shù)學(xué)分析重讀微積分理解極限算法
這篇文章主要為大家介紹了R語言編程重讀微積分?jǐn)?shù)學(xué)分析理解極限算法的詳細(xì)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10R語言將變量分組的3種方法實(shí)例(含cut函數(shù)說明)
在數(shù)據(jù)處理分析過程中,變量分組是經(jīng)常遇到的,下面這篇文章主要給大家介紹了關(guān)于R語言將變量分組的3種方法,其中含cut函數(shù)說明的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08解決R語言報錯:Error?in?y?+?1:non-numeric?argument?to?binary
R語言編程中的常見錯誤有一些錯誤是R的初學(xué)者和經(jīng)驗(yàn)豐富的R程序員都可能常犯的,下面這篇文章主要給大家介紹了關(guān)于解決R語言報錯:Error?in?y?+?1:non-numeric?argument?to?binary?operator的相關(guān)資料,需要的朋友可以參考下2022-11-11數(shù)模技巧不用for循環(huán)且使用ggplot2實(shí)現(xiàn)地圖上連線
這篇文章主要為大家介紹了一個數(shù)模技巧怎樣使用ggplot2不用for循環(huán)來實(shí)現(xiàn)地圖上連線,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11