R语言数据集行列互换技巧

Python025

R语言数据集行列互换技巧,第1张

R语言数据集行列互换技巧

现在给大家介绍的数据处理技巧是长转宽,也就相当于Excel中的转置,不过用R语言实现的长转宽还有数据合并的功能,自然比Excel强大多了。

这里给大家介绍4个函数,其中melt()、dcast()来自reshape2包,gather()、spread()来自tidyr包

一、宽转长——melt()、gather()

[python] view plain copy

mydata<-data.frame(

name=c("store1","store2","store3","store4"),

address=c("普陀区","黄浦区","徐汇区","浦东新区"),

sale2014=c(3000,2500,2100,1000),

sale2015=c(3020,2800,3900,2000),

sale2016=c(5150,3600,2700,2500),

sale2017=c(4450,4100,4000,3200)

)

#宽转长——melt

mydata1<-melt(

mydata,

id.vars=c("address","name"),#要保留的主字段

variable.name = "Year",#转换后的分类字段名称(维度)

value.name = "Sale" #转换后的度量值名称

)

输出结果

[python] view plain copy

>mydata1<-melt(

+ mydata,

+ id.vars=c("address","name"),#要保留的主字段

+ variable.name = "Year",#转换后的分类字段名称(维度)

+ value.name = "Sale" #转换后的度量值名称

+ )

>mydata1

address name Year Sale

1普陀区 store1 sale2014 3000

2黄浦区 store2 sale2014 2500

3徐汇区 store3 sale2014 2100

4 浦东新区 store4 sale2014 1000

5普陀区 store1 sale2015 3020

6黄浦区 store2 sale2015 2800

7徐汇区 store3 sale2015 3900

8 浦东新区 store4 sale2015 2000

9普陀区 store1 sale2016 5150

10 黄浦区 store2 sale2016 3600

11 徐汇区 store3 sale2016 2700

12 浦东新区 store4 sale2016 2500

13 普陀区 store1 sale2017 4450

14 黄浦区 store2 sale2017 4100

15 徐汇区 store3 sale2017 4000

16 浦东新区 store4 sale2017 3200

再来看看gather()函数怎么用

[python] view plain copy

>#宽转长——gather

>mydata1<-tidyr::gather(

+ data=mydata,

+ key="Year",

+ value="sale",

+ sale2014:sale2017

+ )

>mydata1

name address Year sale

1 store1 普陀区 sale2014 3000

2 store2 黄浦区 sale2014 2500

3 store3 徐汇区 sale2014 2100

4 store4 浦东新区 sale2014 1000

5 store1 普陀区 sale2015 3020

6 store2 黄浦区 sale2015 2800

7 store3 徐汇区 sale2015 3900

8 store4 浦东新区 sale2015 2000

9 store1 普陀区 sale2016 5150

10 store2 黄浦区 sale2016 3600

11 store3 徐汇区 sale2016 2700

12 store4 浦东新区 sale2016 2500

13 store1 普陀区 sale2017 4450

14 store2 黄浦区 sale2017 4100

15 store3 徐汇区 sale2017 4000

16 store4 浦东新区 sale2017 3200

和melt()函数不同,gather()函数需要指定关键字段key,以及关键字段对应的值value,但是gather()函数更加好理解。

二、长转宽——dcast()和spread()

还是用上面的data1数据集,先来看看dcast()函数

[python] view plain copy

#长转宽——dcast

dcast(

data=mydata1,

name+address~Year

#左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式

#右侧分类变量的类别个数

)

[python] view plain copy

>#长转宽——dcast

>dcast(

+ data=mydata1,

+ name+address~Year

+ #左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式

+ #右侧分类变量的类别个数

+ )

Using sale as value column: use value.var to override.

name address sale2014 sale2015 sale2016 sale2017

1 store1 普陀区 3000 3020 5150 4450

2 store2 黄浦区 2500 2800 3600 4100

3 store3 徐汇区 2100 3900 2700 4000

4 store4 浦东新区 1000 2000 2500 3200

dcast()函数的使用规则需要琢磨下才能理解,大家好好看看注释部分,再来看看spread()

[python] view plain copy

#长转宽——spread

tidyr::spread(

data=mydata1,

key=Year,

value=sale

)

[python] view plain copy

>#长转宽——spread

>tidyr::spread(

+ data=mydata1,

+ key=Year,

+ value=sale

+ )

name address sale2014 sale2015 sale2016 sale2017

1 store1 普陀区 3000 3020 5150 4450

2 store2 黄浦区 2500 2800 3600 4100

3 store3 徐汇区 2100 3900 2700 4000

4 store4 浦东新区 1000 2000 2500 3200

直接调用tidyr::spread,需要指定关键字段key和对应的值value。

但是从理解上来看,我个人更喜欢tidyr包的函数,使用很清晰,大家可以根据实际情况自行选择,好啦,今天的分享结束,下次再见!

R语言之创建数据集

数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。

R中有许多用于存储数据的结构,包括标量、向量、数组、数据框和列表。

在R中,对象(object)是指可以赋值给变量的任何事物,包括常量、数据结构、函数、甚至是图形。因子(factor)是名义型变量或有序型变量,在R中被特殊地存储和处理。

R中的数据结构:

1.1向量

向量是用于存储数值型、字符型或逻辑型数据的一维数组。创建向量使用函数c(),如下例所示:

数值型向量:a<-c(1,2,5,3,6,-2,4)

字符型向量:b<-c("one","two","three")

逻辑型向量:c<-c(TRUE,TRUE,TRUE,FALSE,TRUE)

注:单个向量中的数据必须拥有相同的类型或模式。

标量是只含一个元素的向量,例如f<-3、g<-"US"和h<-TRUE。它们用于保存常量。

访问向量中的元素,可在方括号中给定元素所处位置的数值,如:a[c(2,4)]用于访问向量a中的第二个和第四个元素。

1.2矩阵

矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型),可以通过matrix创建矩阵

一般使用格式为:

mymatrix<-matrix(vector,nrow=number_of_rows,ncol=number_of_columns,byrow=logical_value,dimnames=list(

char_vector_rownames,char_vector_colnames)) ,其中vector包含了矩阵的元素,nrow和ncol用以指定

行和列的维数,dimnames包含了可选的以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行

填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充。代码演示如下:

[plain] view plain copy

>cells<-c(1,23,56,485)

>rnames<-c("R1","R2")

>cnames<-c("c1","c2")

[plain] view plain copy

<pre name="code" class="html">>mymatrix<-matrix(cells ,nrow=2,ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))

>mymatrix

c1 c2

R1 1 23

R2 56 485

1.3数组

数组与矩阵类似,但是维数可以大于2。数组可通过array函数创建,形式如下:

myarray<-array(vector,dimensions,dimnames),其中vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimnames是可选的、各维度名称标签的列表。代码如下:

[html] view plain copy

>dim<-c("A1","A2")

>dim1<-c("A1","A2")

>dim2<-c("B1","B2","B3")

>dim3<-c("C1","C2","C3","C4")

>z<-array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3))

>z

, , C1

B1 B2 B3

A1 1 3 5

A2 2 4 6

, , C2

B1 B2 B3

A1 7 9 11

A2 8 10 12

, , C3

B1 B2 B3

A1 13 15 17

A2 14 16 18

, , C4

B1 B2 B3

A1 19 21 23

A2 20 22 24

1.4数据框

数据框中不同的列可以包含不同模式(数值型、字符型等)的数据,是R中最常处理的数据结构。数据框可以通过函数data.frame()创建:mydata<-data.frame(col1,col2,col3,...),其中的列向量col1,col2,col3,...可为任何类型(如字符型、数值型或逻辑型)。每一列的名称可由函数names指定。代码如下:

[html] view plain copy

>age<-c(25,34,28,53)

>patientID<-c(1,2,3,4)

>diabetes<-c("Type1","Type2","Type1","Type1")

>status<-c("Poor","Improved","Excellent","Poor")

>patientdata<-data.frame(patientID,age,diabetes,status)

>patientdata

patientID age diabetesstatus

1 1 25Type1 Poor

2 2 34Type2 Improved

3 3 28Type1 Excellent

4 4 53Type1 Poor

>patientdata$age

[1] 25 34 28 53

<pre name="code" class="html">>table(patientdata$diabetes,patientdata$status)

Excellent Improved Poor

Type1 102

Type2 010

$被用来选取一个给定数据框中的某个特定变量,上面table(patientdata$diabetes,patientdata$status)生成了 diabetes和status的列联表。

函数attach()可将数据框添加到R的搜索路径中。

函数detach()将数据框从搜素路径中移除。

相对于attach。多数的R书籍更推荐使用函数with()。

1.5因子

变量可归结为名义型、有序型或连续型变量。类别(名义型)变量和有序类别(有序型)变量在R中称为因子。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。

函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1...k](其中k是名义变量中唯一值得个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。

名义型eg:假设有向量:diabetes<-c("Type1","Type2","Type1","Type1")

语句diabetes<-factor(diabetes)将此向量存储为(1,2,1,1).

有序型eg: 对于给定变量status<-c("Poor","Improved","Excellent","Poor")

语句status<-factor(status,ordered=TRUE)会将向量编码为(3,2,1,3)。

1.6列表(list)

列表是R的数据类型中最为复杂的一种。列表就是一些对象的(或成分,component)的有序集合。列表允许你整合若干(可能无关)的对象到单个对象名下。例如,某个列表中可能是若干向量、矩阵、数据框,甚至是其他列表的组合。可以使用函数list()创建列表:

mylist<-list(object1,object2,...)

注:列表成为了R中的重要数据结构。

1.列表允许以一种简单的方式组织和重新调用不相干的信息;

2.许多R函数的运行结果都是以列表的形式返回的。