9数据集的合并
有时我们会需要把两个或者多个数据集合并为一个。
> dataA<-read.table(header=T,text='
+ storyid title
+ 1 lions
+ 2 tigers
+ 3 bears')
> dataA
storyid title
1 1 lions
2 2 tigers
3 3 bears
> # 创建数据框dataB
> dataB <- read.table( header = T, text = '
+ subject storyid rating
+ 1 1 6.7
+ 1 2 4.5
+ 2 2 3.3
+ 2 1 5.2
+ ')
> dataB
subject storyid rating
1 1 1 6.7
2 1 2 4.5
3 2 2 3.3
4 2 1 5.2
> merge(dataA, dataB, by="storyid")
storyid title subject rating
1 1 lions 1 6.7
2 1 lions 2 5.2
3 2 tigers 1 4.5
4 2 tigers 2 3.3
如果从这个例子中我们可以看到合并依据的是dataA和dataB的共有列向量storyid。
那如果dataA和dataB没有共有列向量呢?
或者说虽然这个向量在两个数据集代表的意义是相同的,但是名字不一样,该怎么办?
> colnames(dataA)[1]<-c("id")
> dataA
id title
1 1 lions
2 2 tigers
3 3 bears
> merge(x=dataA, y=dataB,by.x = "id",by.y="storyid")
id title subject rating
1 1 lions 1 6.7
2 1 lions 2 5.2
3 2 tigers 2 4.5
4 2 tigers 2 3.3
列合并是非常有用的,下面来说一个实例:
现有某一地区的植物名录表格gao.csv,表格只有两列,分别为中文名和name。
还有中国IUCN植物红色名录数据表格chinaIUCN.csv,表格内只有两列,分别为濒危等级level和species。
我们要做的是通过匹配2个表格获得该地区植物的IUCN评估等级表。
两个表格都在E盘中的Rdata文件夹下
> a<-read.csv("E:/Rdata/gao.csv")
> b<-read.csv("E:/Rdata/chinaIUCN.csv")
> c<-merge(a,b,by.a="name",by.b="species",all.b=T)
> head(c)
中文名 name level
1 丛生真藓 Bryum caespiticium LC
2 蕨Pteridium aquilinum var. latiusculum LC
3 紫轴凤尾蕨 Pteris aspericaulis LC
4 长盖铁线蕨 Adiantum fimbriatum LC
5 金毛裸蕨 Paragymnopteris vestita LC
6 鳞柄短肠蕨 Allantodia squamigera LC
species
1 Eranthemum austrosinense var. pubipetalum
2 Eranthemum austrosinense var. pubipetalum
3 Eranthemum austrosinense var. pubipetalum
4 Eranthemum austrosinense var. pubipetalum
5 Eranthemum austrosinense var. pubipetalum
6 Eranthemum austrosinense var. pubipetalum
> write.csv(c,"E:/Rdata/gov_IUCN.csv")
除了上面讲到的合并方式,还有行合并和列合并
行合并的时候dataA 和dataB需要具有一样的列向量,命令为:
total<-rbind(dataA,dataB)
列合并的时候要求dataA 和dataB含有一样的行数并且以相同的顺序排序:
total<-cbind(dataA,dataB)
> dfA <- data.frame( Subject = c(1, 1, 2, 2), Response = c("X", "X", "X", "X") )
> dfB <- data.frame( Subject = c(1, 2, 3), Response = c("Z", "Y", "Z") )
> dfA
Subject Response
1 1 X
2 1 X
3 2 X
4 2 X
> dfB
Subject Response
1 1 Z
2 2 Y
3 3 Z
> df <- rbind(dfA, dfB)
> df
Subject Response
1 1 X
2 1 X
3 2 X
4 2 X
5 1 Z
6 2 Y
7 3 Z
10数据子集的提取
有的时候我们可能会提取数据的一部分。下面给出了一个具体实例:
> df <- read.table( header = T, text = '
+ subject sex size
+ 1 M 7
+ 2 F 6
+ 3 F 9
+ 4 M 11
+ ')
> df
subject sex size
1 1 M 7
2 2 F 6
3 3 F 9
4 4 M 11
#选取数据框第1行
> df[1, ]
subject sex size
1 1 M 7
#选取数据框第1、3行
> df[c(1,3), ]
subject sex size
1 1 M 7
3 3 F 9
#选取数据框第1个列向量的元素
> df[ ,1]
[1] 1 2 3 4
#选取数据框第1、3列向量
> df[ ,c(1,3)]
subject size
1 1 7
2 2 6
3 3 9
4 4 11
#选取数据框第1、3行的1、3列数据信息,数据框展示
> df[c(1,3), c(1,3)]
subject size
1 1 7
3 3 9
#我们也可以用列向量的名字选取
> df[ ,"size"]
[1] 7 6 9 11
> df[ "size"]
size
1 7
2 6
3 9
4 11
> df[ ,c("size","sex")]
size sex
1 7 M
2 6 F
3 9 F
4 11 M
还有一个好用的函数subset帮助我们选取子集
> subset(df , select = subject)
subject
1 1
2 2
3 3
4 4
> subset(df , subject < 3)
subject sex size
1 1 M 7
2 2 F 6
> subset(df , subject < 3, select = -subject)
sex size
1 M 7
2 F 6
> subset(df , subject < 3 & sex=="M")
subject sex size
1 1 M 7
11查看呢与删除对象
在R中如果我们想看到对象的信息,简而言之,就是看有哪些对象,就要用到ls()函数
> name<-"Carmen";n<-10;n2<-100;m<-0.5
我们可以看到在R中用;来隔开同一行中的不同命令语句
> ls()
[1] "m" "n" "n2" "name"
如果只显示在名称中带有某个字符的对象,需要用到pattern选项,简写为pat
#显示对象中带有“m”的对象
> ls(pat="m")
#显示对象中以“m”开头的对象
[1] "m" "name"
> ls(pat="^m")
[1] "m"
用ls.str列出对象及对象的信息,包括具体的数据和数据类型
> ls.str()
m : num 0.5
n : num 10
n2 : num 100
name : chr "Carmen"
要在内存中删除某个对象,利用rm()
#删除对象m
> rm(m)
> ls()
[1] "n" "n2" "name"
#删除所有包含字符m的对象
> rm(list=ls(pat="m"))
> ls()
[1] "n" "n2"
#删除所有对象
> rm(list=ls())
> ls()
character(0)
参考资料:
R for beginners
ucas相关课程课件
网友评论