R语言学习系列17数据整合Ⅰ基本操作汇总.docx
《R语言学习系列17数据整合Ⅰ基本操作汇总.docx》由会员分享,可在线阅读,更多相关《R语言学习系列17数据整合Ⅰ基本操作汇总.docx(15页珍藏版)》请在冰豆网上搜索。
![R语言学习系列17数据整合Ⅰ基本操作汇总.docx](https://file1.bdocx.com/fileroot1/2023-1/23/fe3e15f7-1701-4ce6-b8c5-2ce93aa5213c/fe3e15f7-1701-4ce6-b8c5-2ce93aa5213c1.gif)
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