美文网首页
R中的对象(下)

R中的对象(下)

作者: xiaoxianyu | 来源:发表于2020-01-13 15:53 被阅读0次

    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相关课程课件

    相关文章

      网友评论

          本文标题:R中的对象(下)

          本文链接:https://www.haomeiwen.com/subject/jxfnactx.html