前几篇博文,我们简单的使用了向量、数据框,这一篇文章我们来做一些小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 ......
>
网友评论