美文网首页
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