美文网首页
R语言数据框DataFrame实例

R语言数据框DataFrame实例

作者: 采星星的小太阳BavaLI | 来源:发表于2020-05-09 00:02 被阅读0次

    前几篇博文,我们简单的使用了向量、数据框,这一篇文章我们来做一些小Test!,加深理解。

    实验一:

    R语言日期类型的话,需要写成日期类型
    大数据系统:HDFS,Hive,不需要保存日期类型,字符串。

    stringsAsFactors参数:

    第一个数据框
    student <-  data.frame(
      id = c (11:13), 
      names = c("a","b","c"),
      birthdate = c("2013-05-21","2013-05-22","2014-06-17")
      ,stringsAsFactors = FALSE#默认为TRUE
    )
    第二个数据框
    student2 <-     data.frame(
      id = c (11:13), 
      names = c("a","b","c"),
      birthdate = c("2013-05-21","2013-05-22","2014-06-17")
    )
    
    image.png

    我们会看到,birthdate的数据类型不一样,一个是chr也就是字符型,一个是Factor 因子,那么它们有什么不同呢?我举一个例子:

    > student2$birthdate -student2$birthdate#可以做运算,忽略警告
    [1] NA NA NA
    Warning message:
    In Ops.factor(student2$birthdate, student2$birthdate) :
      ‘-’ not meaningful for factors
    > student$birthdate -student$birthdate#不可以运算
    Error in student$birthdate - student$birthdate : 
      non-numeric argument to binary operator
    

    实验二:(基本操作)

    > #1、构建数据集 (向量 | 数据框)
    > student <- data.frame(
    +     id = c(11:13)
    +     ,names = c("刘德华","吴京","周星驰")
    +     ,birthdate = as.Date(c('2020-01-01'
    +                            ,'2020-01-02'
    +                            ,'2020-01-03'))
    +     ,stringsAsFactors = FALSE 
    + )
    > #返回特征的名字
    > names(student)
    [1] "id"        "names"     "birthdate"
    > #查看数据行号
    > row.names(student)
    [1] "1" "2" "3"
    > student
      id  names  birthdate
    1 11 刘德华 2020-01-01
    2 12   吴京 2020-01-02
    3 13 周星驰 2020-01-03
    > #可修改数据的行号 但修改之后 默认索引还是存在的
    > row.names(student) = c('a','b','c')
    > student
      id  names  birthdate
    a 11 刘德华 2020-01-01
    b 12   吴京 2020-01-02
    c 13 周星驰 2020-01-03
    

    修改索引之后要注意:

    > student
      id  names  birthdate
    a 11 刘德华 2020-01-01
    b 12   吴京 2020-01-02
    c 13 周星驰 2020-01-03
    > # 为什么要添加引号 class(row.names(student))
    > class(row.names(student))#查看修改后的索引类型
    [1] "character"
    > student[1]#默认代表第一列
      id
    a 11
    b 12
    c 13
    > student[1,]#加了逗号之后代表查看第一行,列参数省略代表所有列
      id  names  birthdate
    a 11 刘德华 2020-01-01
    > student[a]#报错
    Error in `[.data.frame`(student, a) : object 'a' not found
    > student['a']#加了‘’还是错,原因是当只有一个参数,你又不加逗号的时候,只能使用默认数字索引,代表第几列
    Error in `[.data.frame`(student, "a") : undefined columns selected
    > student['a',]#正确 等价于 student[1,]
      id  names  birthdate
    a 11 刘德华 2020-01-01
    > 
    
    > #获取新的行号11,12的样本数据
    > student(c('a','b'),)#由于很多人习惯把[]写成()而报错,注意一下!
    Error in student(c("a", "b"), ) : could not find function "student"
    > student[c('a','b'),]
      id  names  birthdate
    a 11 刘德华 2020-01-01
    b 12   吴京 2020-01-02
    #那么默认索引还可以使用嘛?是的
    > student
      id  names  birthdate
    a 11 刘德华 2020-01-01
    b 12   吴京 2020-01-02
    c 13 周星驰 2020-01-03
    > student[c(1,2)]#获取第一二列的数据
      id  names
    a 11 刘德华
    b 12   吴京
    c 13 周星驰
    > student[c(1,2),]#获取第一二行的数据
      id  names  birthdate
    a 11 刘德华 2020-01-01
    b 12   吴京 2020-01-02
    > 
    #注意
    > student[c(1,2),]
      id  names  birthdate
    a 11 刘德华 2020-01-01
    b 12   吴京 2020-01-02
    > student[c('a','b'),]
      id  names  birthdate
    a 11 刘德华 2020-01-01
    b 12   吴京 2020-01-02
    > student[1:3,]#支持原始索引切片
      id  names  birthdate
    a 11 刘德华 2020-01-01
    b 12   吴京 2020-01-02
    c 13 周星驰 2020-01-03
    > student['a':'b'),]#不支持重命名索引切片
    Error: unexpected ')' in "student['a':'b')"
    
    #python: loc | iloc
    #经过这个实验得出一个结论:R语言中尽量不要修改默认索引
    student["11":"12",]#报错!
    #获取一列 
    student[["names"]] #方式一
    student$names#方式二 
    student["names"] # 返回类型date.frame 
    > student[['names']]
    [1] "刘德华" "吴京"   "周星驰"
    > class( student[['names']])
    [1] "character"
    > student['names']
       names
    a 刘德华
    b   吴京
    c 周星驰
    > class(student['names'])
    [1] "data.frame"
    > student$names
    [1] "刘德华" "吴京"   "周星驰"
    > class(student$names)
    [1] "character"
    >
    
    #查看每列的数据类型 
    > str(student)
    'data.frame':   3 obs. of  3 variables:
     $ id       : int  11 12 13
     $ names    : chr  "刘德华" "吴京" "周星驰"
     $ birthdate: Date, format: "2020-01-01" ...
    

    实验三 :修改特征类型

    小贴士: 对比pyhton(数据挖掘) | 特征必须是数值型 | 不允许是字符型
    平方米 商圈 城市 房价
    100 1 北京 100

    #修改数据类型
        #总结:给每个特征赋予类型有两个方法
        #构建数据框的时候直接赋予类型
        #在构建数据框之后手动修改类型
    student
      id  names  birthdate
    1 11 刘德华 2020-01-01
    2 12   吴京 2020-01-02
    3 13 周星驰 2020-01-03
    > str(student)
    'data.frame':   3 obs. of  3 variables:
     $ id       : int  11 12 13
     $ names    : Factor w/ 3 levels "刘德华","吴京",..: 1 2 3
     $ birthdate: Factor w/ 3 levels "2020-01-01","2020-01-02",..: 1 2 3
    > student$names = as.character(student$names)#使用as.XX方法,传入参数即可
    > student$birthdate = as.Date(student$birthdate)
    > student
      id  names  birthdate
    1 11 刘德华 2020-01-01
    2 12   吴京 2020-01-02
    3 13 周星驰 2020-01-03
    > str(student)
    'data.frame':   3 obs. of  3 variables:
     $ id       : int  11 12 13
     $ names    : chr  "刘德华" "吴京" "周星驰"
     $ birthdate: Date, format: "2020-01-01" ...
    > 
    

    添加新的列

    > student
      id  names  birthdate
    1 11 刘德华 2020-01-01
    2 12   吴京 2020-01-02
    3 13 周星驰 2020-01-03
    > student$age = c(1,2,4)#常规添加
    > student
      id  names  birthdate age
    1 11 刘德华 2020-01-01   1
    2 12   吴京 2020-01-02   2
    3 13 周星驰 2020-01-03   4
    > student$now_time <- as.integer(format(Sys.Date(),'%Y'))#添加当年,运用了两个函数
    > student
      id  names  birthdate age now_time
    1 11 刘德华 2020-01-01   1     2020
    2 12   吴京 2020-01-02   2     2020
    3 13 周星驰 2020-01-03   4     2020
    > 
    

    快速打印

    with(
     student,{
      print(names)
    
    }
    )
    [1] "刘德华" "吴京"   "周星驰"
    
    > #修改值   within 添加新的列(特征)
    > student <- within(
    +     student
    +     ,Age1 <- (as.integer(format(Sys.Date(),"%Y")) - as.integer(format(student$birthdate,"%Y")))
    + )
    > student
      id  names  birthdate age now_time Age1
    1 11 刘德华 2020-01-01   1     2020    0
    2 12   吴京 2020-01-02   2     2020    0
    3 13 周星驰 2020-01-03   4     2020    0
    
        #within语法,并不是原始数据集(student)
        #上进行的操作,返回数据副本
        student = within(
                            student 
                            ,{
                              Age[1] = 100
                            }
                        )
    
    

    实验四: 数据拼接

    数据集的拼接

    score<-data.frame(
      SID=c(11,12,13,14,22)
      ,Course =c("a","b","c","d","e")
      ,Score = c(10,20,30,40,50)
    )
    
    student2 <- data.frame(
      id=c(21,22)
      ,names=c("彭于晏","张钧甯")
      ,birthdate = c('2020-01-01'
                     ,'2020-01-02')
    )
    > result = merge(score, student2,by.x = 'SID',by.y = 'id')
    > result
      SID Course Score  names  birthdate
    1  22      e    50 张钧甯 2020-01-02
    > 
    
    score<-data.frame(
      SID=c(21,12,21,14,22)
      ,Course =c("a","b","a","d","e")
      ,Score = c(10,20,10,40,50)
    )
    
    student2 <- data.frame(
      id=c(21,22)
      ,names=c("彭于晏","张钧甯")
      ,birthdate = c('2020-01-01'
                     ,'2020-01-02')
    )
    > result = merge(score, student2,by.x = 'SID',by.y = 'id')#指定左表使用‘SID’,右表使用‘id’合并,当有重复值的时候不会自动去重
    > result
      SID Course Score  names  birthdate
    1  21      a    10 彭于晏 2020-01-01#并不会去重
    2  21      a    10 彭于晏 2020-01-01#并不会去重
    3  22      e    50 张钧甯 2020-01-02
    > 
    

    subset (你可以写类似于sql的语句进行查询)

    数据库:select查询
    R语言 :数据框的提取

    > student2
      id  names  birthdate
    1 21 彭于晏 2020-01-01
    2 22 张钧甯 2020-01-02
    > new_stu = subset(student2,select = c('id','names'))#把查询出来的数据父子给一个新的变量
    > new_stu
      id  names
    1 21 彭于晏
    2 22 张钧甯
    > 
    

    数据集末尾进行追加数据集 ,拼接

    > rbind(new_stu,student2)
    Error in rbind(deparse.level, ...) : 变量的列数不对
    > rbind(student,student2)
    Error in rbind(deparse.level, ...) : 变量的列数不对
    > rbind(student2,student2)#在末尾追加,注意列数目一致
      id  names  birthdate
    1 21 彭于晏 2020-01-01
    2 22 张钧甯 2020-01-02
    3 21 彭于晏 2020-01-01
    4 22 张钧甯 2020-01-02
    > 
    

    实验五

    #查询   python | spark rdd 
        student[which(student$Age > 0),]
        student[which(student$Age >0),"names"]
        student[1] # df
        student['Age'] # df
        student[["Age"]] #向量 
        student[1:2,1:3] #数据集切片 
        #根据一个条件查询多个特征(字段)
        #数据库查询 :行:记录 | 列:字段 
        #数据挖掘(数据分析):行 : 样本 | 列:特征
        subset(student,Age>0,select=c("names","id"))
     student
      id  names  birthdate age now_time Age1
    1 11 刘德华 2020-01-01   1     2020    0
    2 12   吴京 2020-01-02   2     2020    0
    3 13 周星驰 2020-01-03   4     2020    0
    > subset(student,age>4)
    [1] id        names     birthdate age       now_time  Age1     
    <0 行> (或0-长度的row.names)
    > subset(student,age>2)
      id  names  birthdate age now_time Age1
    3 13 周星驰 2020-01-03   4     2020    0
    > subset(student,age>2,select = 'names')
       names
    3 周星驰
        #多个条件的查询  使用【& 】进行连接条件
        subset(student,Age>0 & names=='刘德华',select=c("names","id"))
    
        类sql编程(api 查询,关联)
        select  names ,id from table_name where ......
    

    subset()Age------age对大小写敏感的

    > subset(student,Age>0 & names=='刘德华',select=c("names","id"))
    Error in eval(e, x, parent.frame()) : object 'Age' not found
    > subset(student,age>0 & names=='刘德华',select=c("names","id"))
       names id
    1 刘德华 11
    类sql编程(api 查询,关联)
    select  names ,id from table_name where ......
    > 
    

    好啦,今天就到这里,可以说讲的很仔细了,大家慢慢悟吧,希望能帮助到爱学习的你们!如果可以,我很开心!如果想深入学习R,欢迎访问我的主页R专栏!

    相关文章

      网友评论

          本文标题:R语言数据框DataFrame实例

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