最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

R語言 數(shù)據(jù)集行列互換的技巧分享

 更新時間:2021年03月27日 12:07:52   作者:數(shù)據(jù)蜂鳥  
這篇文章主要介紹了R語言 數(shù)據(jù)集行列互換的技巧分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

現(xiàn)在給大家介紹的數(shù)據(jù)處理技巧是長轉(zhuǎn)寬,也就相當(dāng)于Excel中的轉(zhuǎn)置,不過用R語言實現(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ù)實際情況自行選擇,好啦,今天的分享結(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中實現(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ù)運算,比如使用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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

最新評論

中宁县| 武功县| 娱乐| 灌阳县| 新泰市| 芒康县| 大田县| 济宁市| 木兰县| 塘沽区| 丰台区| 木兰县| 南城县| 理塘县| 静海县| 鄂托克前旗| 石家庄市| 隆子县| 柳州市| 浠水县| 庐江县| 沙田区| 内黄县| 安多县| 靖远县| 广宗县| 平利县| 土默特左旗| 西青区| 高唐县| 宜章县| 霍林郭勒市| 汉川市| 洱源县| 美姑县| 高安市| 河源市| 香格里拉县| 博湖县| 德江县| 华安县|