R语言学习系列17数据整合Ⅰ基本操作汇总.docx

上传人:b****6 文档编号:7419772 上传时间:2023-01-23 格式:DOCX 页数:15 大小:90.41KB
下载 相关 举报
R语言学习系列17数据整合Ⅰ基本操作汇总.docx_第1页
第1页 / 共15页
R语言学习系列17数据整合Ⅰ基本操作汇总.docx_第2页
第2页 / 共15页
R语言学习系列17数据整合Ⅰ基本操作汇总.docx_第3页
第3页 / 共15页
R语言学习系列17数据整合Ⅰ基本操作汇总.docx_第4页
第4页 / 共15页
R语言学习系列17数据整合Ⅰ基本操作汇总.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

R语言学习系列17数据整合Ⅰ基本操作汇总.docx

《R语言学习系列17数据整合Ⅰ基本操作汇总.docx》由会员分享,可在线阅读,更多相关《R语言学习系列17数据整合Ⅰ基本操作汇总.docx(15页珍藏版)》请在冰豆网上搜索。

R语言学习系列17数据整合Ⅰ基本操作汇总.docx

R语言学习系列17数据整合Ⅰ基本操作汇总

16.数据整合Ⅰ—基本操作

目录:

一.数据框创建新变量

二、变量的重命名

三.变量的重新编码

四.数据排序

五.数据合并

六.选取数据的子集

七.简单的随机抽样

正文:

一、数据框创建新变量

假设有MyData数据框,其中变量为x1,x2.现创建名为sumx和meanx的新变量,分别存储变量x1与x2的加和与均值。

#方法1

MyData$sumx<-MyData$x1+MyData$x2

MyData$meanx<-(MyData$x1+MyData$x2)/2

#方法2

attach(MyData)

MyData$sumx<-x1+x2

MyData$meanx<-(x1+x2)/2

detach(MyData)

#方法3(建议方法)

MyData<-transform(MyData,

sumx=x1+x2,

meanx=(x1+x2)/2)

二、变量的重命名

1.用交互式编辑器

若修改数据集x的变量名,键入函数fix(x),即可打开交互式编辑器界面。

score<-data.frame(student=c("A","B","C","D"),gender=c("M","M","F","F"),math=c(90,70,80,60),Eng=c(88,78,69,98),pl=c(66,59,NA,88))

fix(score)

score.list<-as.list(score)#将score转化为列表

fix(score.list)

(1)若数据集为矩阵或数据框

将打开“数据编辑器”,单击要修改的变量名,在弹出的“变量编辑器”修改即可:

(2)若数据集为列表

将交互式编辑器为一个记事本,只需修改“.Names”之后对应的变量名即可:

2.用函数rename()

reshape包中的函数rename(),用来修改数据库和列表的变量名,但不能修改矩阵的变量名,基本格式为:

rename(x,c(oldname="newname",...))

其中,oldname为原变量名,newname为新变量名。

library(reshape)

rename(score,c(pl="chinese"))

studentgendermathEngchinese

1AM908866

2BM707859

3CF8069NA

4DF609888

rename(score.list,c(pl="chinese"))

$student

[1]ABCD

Levels:

ABCD

$gender

[1]MMFF

Levels:

FM

$math

[1]90708060

$Eng

[1]88786998

$chinese

[1]6659NA88

注意:

原数据集中的变量名并未被修改。

3.用函数names()

和rename()一样可用来修改数据框和列表的变量名,不能修改矩阵的变量名;区别在于:

names()会在原数据集中修改变量名。

其基本格式为:

names(x)[i]<-"newname"

names(score)[5]="chinese"

score

studentgendermathEngchinese

1AM908866

2BM707859

3CF8069NA

4DF609888

4.用函数colnames()和rownames()

用来修改矩阵的变量名(行名和列名),也能修改数据框的行名和列名。

基本格式为:

rownames(x)[i]<-"newname"

colnames(score)[5]="Chinese"

score

studentgendermathEngChinese

1AM908866

2BM707859

3CF8069NA

4DF609888

rownames(score)=letters[1:

4]

score

studentgendermathEngChinese

aAM908866

bBM707859

cCF8069NA

dDF609888

三、变量的重新编码

例如,数据集Leader中连续型变量age重新编码为分类型变量rankAge(Young、MiddleAged、Elder)。

首先,必须把99岁的年龄值重新编码为缺失值:

Leader$age[Leader$age==99]<-NA

然后创建rankAge变量:

Leader$rankAge[Leader$age>75]<-"Elder"

Leader$rankAge[Leader$age>=50&Leader$age<=75]<-"MiddleAged"

Leader$rankAge[Leader$age<50]<-"Young"

或者

Leader<-within(Leader,{

rankAge<-NA

rankAge[age>75]<-"Elder"

rankAge[age>=50&age<=75]<-"MiddleAged"

rankAge[age<50]<-"Young"})

四、数据排序

1.函数sort(),基本格式:

sort(x,decreasing=FALSE,na.last=FALSE,...)

其中,

x为排序对象(数值型或字符型);

decreasing默认为FALSE即升序,TURE为降序;

na.last默认为FALSE(NA值将被删除),若为TRUE,则将向量中的NA值放到序列末尾。

sort(score$math)

[1]60708090

sort(score$math,decreasing=TRUE)

[1]90807060

sort(score$Chinese,na.last=TRUE)

[1]596688NA

 

2.函数rank()

返回值是该向量中对应元素的秩(排名),基本格式为:

rank(x,na.last=FALSE,ties.method=...)

其中,ties.method指定对数据集中的重复数据的秩的处理方式:

“average”——取平均值秩(默认)

“first”——位于前面的数据的秩取小,依次递增

“random”——随机定义重复秩

“max”——取最大重复秩

“min”——取最小重复秩

x<-c(3,4,2,5,5,3,8,9)

rank(x)

[1]2.54.01.05.55.52.57.08.0

rank(x,ties.method="first")

[1]24156378

rank(x,ties.method="random")

[1]34165278

rank(x,ties.method="max")

[1]34166378

3.函数order()

对数据进行排序,返回值是对应“排名”的元素所在向量中的位置,即最小值、次小值、...、最大值所在的位置。

基本格式为:

order(x,decreasing=FALSE,na.last=FALSE,...)

不同于前两个函数,order()还可以对数据框进行排序:

data_frame[order(data_frame$v1,data_frame$v2,…),]

若v1值相同,则按v2升序排序;要将升序改为降序,在变量前添加负号,或用decreasing=TRUE即可。

order(score$math)

[1]4231

score[order(score$math),]

studentgendermathEngchinese

4DF609888

2BM707859

3CF8069NA

1AM908866

score[order(-score$math),]

studentgendermathEngchinese

1AM908866

3CF8069NA

2BM707859

4DF609888

4.函数rev()

求逆序,将序列进行反转,即1,2,3变成3,2,1

注:

数据框转置(行列交换),使用t(data)即可。

五、数据合并

1.使用函数

rbind(),增加行(样本数据),要求宽度(列数)相同;

cbind(),增加列(属性变量),要求高度(行数)相同

(见第04篇)

2.使用函数merge()

用来合并两个数据框,按行名或变量名匹配。

基本格式为:

merge(x,y,by=…,by.x=…,by.y=…,all=…,

all.x=…,all.y=…,...)

其中,

x,y为要合并的数据集;

by指定合并的依据(相同的行或列),默认按相同的列连接;

by.x,by.y分别为第一、二个数据框指定连接的列;

all,all.x,all.y默认为FALSE,仅输出x和y中都包含的行(内连接);all.x为TURE,则为左外连接;all.y为TURE,则为右外连接;all=TRUE,则为全连接

仅返回两个表匹配的数据

左外连接:

返回左表的数据,以及匹配的数据

右外连接:

返回右表的数据,以及匹配的数据

全连接:

返回左右表的数据,以及匹配的数据

例1

setwd("E:

/办公资料/R语言/R语言学习系列/codes")

load("salary.Rdata")

index<-list("City"=data$City,"Index"=1:

15)

data1<-merge(data,index,by="City")

head(data1)

CityWorkPriceSalaryIndex

1Amsterdam171465.649.01

2Bombay205230.35.32

3Chicago192473.961.93

4Dublin175976.041.44

5Frankfurt165074.560.45

6London173784.246.26

例2

authors<-data.frame(

surname=I(c("Tukey","Venables","Tierney","Ripley","McNeil")),

nationality=c("US","Australia","US","UK","Australia"),

deceased=c("yes",rep("no",4)))

authors

surnamenationalitydeceased

1TukeyUSyes

2VenablesAustraliano

3TierneyUSno

4RipleyUKno

5McNeilAustraliano

books<-data.frame(

name=I(c("Tukey","Venables","Tierney",

"Ripley","Ripley","McNeil","RCore")),

title=c("ExploratoryDataAnalysis",

"ModernAppliedStatistics...",

"LISP-STAT",

"SpatialStatistics","StochasticSimulation",

"InteractiveDataAnalysis",

"AnIntroductiontoR"),

other.author=c(NA,"Ripley",NA,NA,NA,NA,

"Venables&Smith"))

books

nametitleother.author

1TukeyExploratoryDataAnalysis

2VenablesModernAppliedStatistics...Ripley

3TierneyLISP-STAT

4RipleySpatialStatistics

5RipleyStochasticSimulation

6McNeilInteractiveDataAnalysis

7RCoreAnIntroductiontoRVenables&Smith

m1<-merge(authors,books,by.x="surname",by.y="name")#内连接

m1

surnamenationalitydeceasedtitleother.author

1McNeilAustralianoInteractiveDataAnalysis

2RipleyUKnoSpatialStatistics

3RipleyUKnoStochasticSimulation

4TierneyUSnoLISP-STAT

5TukeyUSyesExploratoryDataAnalysis

6VenablesAustralianoModernAppliedStatistics...Ripley

m2<-merge(authors,books,by.x="surname",by.y="name",all.x=TRUE)#左外连接

m2

surnamenationalitydeceasedtitleother.author

1McNeilAustralianoInteractiveDataAnalysis

2RipleyUKnoSpatialStatistics

3RipleyUKnoStochasticSimulation

4TierneyUSnoLISP-STAT

5TukeyUSyesExploratoryDataAnalysis

6VenablesAustralianoModernAppliedStatistics...Ripley

m3<-merge(authors,books,by.x="surname",by.y="name",all.y=TRUE)#右外连接

m3

surnamenationalitydeceasedtitleother.author

1McNeilAustralianoInteractiveDataAnalysis

2RCoreAnIntroductiontoRVenables&Smith

3RipleyUKnoSpatialStatistics

4RipleyUKnoStochasticSimulation

5TierneyUSnoLISP-STAT

6TukeyUSyesExploratoryDataAnalysis

7VenablesAustralianoModernAppliedStatistics...Ripley

m4<-merge(authors,books,by.x="surname",by.y="name",all=TRUE)#全连接

m4

surnamenationalitydeceasedtitleother.author

1McNeilAustralianoInteractiveDataAnalysis

2RCoreAnIntroductiontoRVenables&Smith

3RipleyUKnoSpatialStatistics

4RipleyUKnoStochasticSimulation

5TierneyUSnoLISP-STAT

6TukeyUSyesExploratoryDataAnalysis

7VenablesAustralianoModernAppliedStatistics...Ripley

x<-data.frame(k1=c(NA,NA,3,4,5),k2=c(1,NA,NA,4,5),data=1:

5)

y<-data.frame(k1=c(NA,2,NA,4,5),k2=c(NA,NA,3,4,5),data=1:

5)

x

k1k2data

1NA11

2NANA2

33NA3

4444

5555

y

k1k2data

1NANA1

22NA2

3NA33

4444

5555

merge(x,y,by=c("k1","k2"))#多变量匹配的内连接

k1k2data.xdata.y

14444

25555

3NANA21

六、选取数据的子集

有时数据需要拆分,尤其是数据量较大时,可能需要提出其中一部分做分析,这就需要对变量(列)和观测(行)进行选入和排除。

1.通过行标、列标或索引

参考第3,4篇。

另外,行列标中可以直接使用表达式或which语句,例如

Newdata<-data[data$Salary>6500,]

newdata<-data[which(data$Salary>6500&age>30),]

注:

排除用“-”号。

从数据框中选择变量,例如

newdata<-data["x1","x2","x3"]

剔除变量:

vars<-names(data)%in%c("x2","x3")

newdata<-data[!

vars]

2.函数subset()——选取子集

基本格式为:

subset(x,subset,select,...)

其中,

x为数据对象;

subset为逻辑表达式,用来指定选取满足某条件的样本;

select指定选取的变量(列)

例如,

newdata<-subset(data,age>=35|age<24,

select=c(q1,q2,q3))

3.使用SQL语句操作数据框

使用sqldf包中的函数sqldf()

library(sqldf)

#从mtcars选择所有变量,只选使用化油器carb的车型(行),按mpg升序排序

newdf<-sqldf("select*frommtcarswherecarb=1orderbympg",row.names=TRUE)

newdf

mpgcyldisphpdratwtqsecvsamgearcarb

Valiant18.16225.01052.763.46020.221031

Hornet4Drive21.46258.01103.083.21519.441031

ToyotaCorona21.54120.1973.702.46520.011031

Datsun71022.84108.0933.852.32018.611141

FiatX1-927.3479.0664.081.93518.901141

Fiat12832.4478.7664.082.20019.471141

ToyotaCorolla33.9471.1654.221.83519.901141

#输出四缸车和六缸车每一gear水平的mpg和disp的平均值

sqldf("selectavg(mpg)asavg_mpg,avg(disp)asavg_disp,gearfrommtcarswherecylin(4,6)groupbygear")

avg_mpgavg_dispgear

120.33333201.03333

224.53333123.01674

325.36667120.13335

七、简单随机抽样

用少量数据测试数据集时,常用随机抽样方法从整体中选出部分样本数据。

简单随机抽样,是指从总体N个样本中任意抽取n个样本,每个样本被抽中的概率相等;分为重复抽样(有放回)、不重复抽样(不放回)。

使用sampling包实现。

1.有放回简单随机抽样

函数srswr(),基本格式为:

srswr(n,N)

表示从总体N中有放回地随机抽取n个样本,返回一个长度为N的向量,每个分量分别表示各元素被抽取到的次数。

library(sampling)

LETTERS

[1]"A""B""C""D""E""F""G""H""I""J""K"

[12]"L""M""N""O""P""Q""R""S""T""U""V"

[23]"W""X""Y""Z"

s<-srswr(10,26)

s

[1]20110000100200030000000

[24]000

ind<-(1:

26)[s!

=0]#被抽到的样本编号

ind

[1]13491216

n<-s[s!

=0]#被抽到的样本的被抽到的次数

n

[1]211123

ind<-rep(ind,times=n)#按次数重复被抽到的样本编号

ind

[1]113491212161616

sample<-LETTERS[ind]#被抽到的字母

sample

[1]"A""A""C""D""I""L""L""P""P""P"

2.不放回简单随机抽样

函数srswor(),格式和返回值同srswr(),注意返回值向量中只有0和1.

s<-srswor(10,26)

s

[1]1000010100100000011

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1