我们的掌握目标:
●操纵日期和缺失值
●熟悉数据类型的转换
●变量的创建和重编码
●数据集的排序、合并与取并集
●选入和丢弃变量
一、数据的创建
最开始的示例:
这个例子很简单,他给出了两个图,一个表示的是数字表示同意的程度;一个表示我们收集的关于五个问题的问答数据。
我们的目的是:通过这个简单数据集,进行判断男性与女性在听从领导程度上的不同。
在这里,我们只谈论数据的管理,最开始我们数据的创建。
结果:
可能出现的错误:
这个代码中新手最容易犯的错误是data与date 输入错误,倘若将创建列表data.frame()的语句之中不慎将date输成了data,将会出现以下报错。
原因很简单,使用class函数可看出,data是function类型。
二、新变量的创建
新变量的创建及变量的替换:
在项目研究中,需要对已有的新变量或者现有的变量进行变换,我们的语句是:
变量名 <- 表达式
在这里,“表达式”是含有多种运算符和函数。
+ - * / ^(**) x%%y x%/%y
加 减 乘 除 求幂 求余 整数除法
创建新的变量并且合并到原始数据框:
假设你有一个名为mydata的数据框,其中的变量为x1和x2,现在你想创建一个新变量sumx存储以上两个变量的加和,并创建一个名为meanx的新变量存储这两个变量的均值,将两个新变量整合到原始的数据框中。
第一种方法:
第二种方法:
第三种方法;
可能出现的错误:
在创建新的变量并且合并到原始数据框可能会出现这两种错误,
一、直接输入以下代码,会出现报错,原因是因为R并不知道x1和x2来自数据框mydata
二、当输入以下代码时,不会出现报错,但是只能创建新的变量,却不能合并到原始数据框
二、变量的重编码
重编码涉及根据同一个变量和/或其他变量的现有值创建新值的过程。举例来说
●将一个连续型变量修改为一组类别值;
●将误编码的值替换为正确值;
●基于一组分数线创建一个表示及格/不及格的变量
这里的意思刚开始有点难懂,所以,后面有个例子,不过在例子之前,我们罗列一下逻辑运算符:
< <= > >= == != ! | & isTURE(x)
小于 小于等于 大于 大于 等于 不等于 非 或 与 测试是否为
接着,进行对连续型变量age进行重编码为agecat(Young、Middle Aged、Elder),先用一个常规的做法:
接下来,使用within(),witnin和with类似,不过within 可以允许修改数据框。
四、变量的重命名
当对现有的名称不满意,可以交互地已编程的方式改变他们。
我们有两种方法:
一、fix(leadership)
二、names(leadership)[2] <- “testDate” #将testDate替换leadership中的第二个名称。
结果:
五、缺失值
数值缺失是不可避免的,
检测、识别缺失值
处理缺失值的注意事项
1、缺失值不可比较,即便是与自身比较
换句话来说,就是无法使用运算符来检测缺失值是否存在
2、R并不能把无限的或者不可能出现的数值标记为缺失值
换句话来说,不能标记正无穷之类的以及sin(inf)
重编码某些值为缺失值
在三中已经介绍
在分析中剔除缺失值
由于x中第三个元素是缺失值,所以y和z都是NA(缺失值)
使用na.omit()删除不完整观测值
六、日期值
日期值通常以字符串的形式输入到R中,然后转换为数值形式储存在的日期变量。
使用as.Data()函数
它的语法:as.Date(x,”input_forrmat”)
其中x是字符型数据,input_forrmat则给出用于读入的日期的适当格式。
先介绍日期值的输入格式:yyyy-mm-dd
将默认格式的字符型数据转换为对应日期。
Sys.Date() 返回当天的日期
date() 返回当前的日期和时间
format(x, format="output_format") 来输出指定格式的日期值
例如:
接下来还有一些函数:
difftime() 来计算时间间隔
as.character() 可将日期值转换为字符型
七、类型转换
现有一个数据类型函数的介绍表
判断类的函数is.datatype返回值是布尔值(0或1),转换的函数as.datatype则是将其将其参数转化为对应类型。
七、数据排序
Order()排序函数,默认升序。排序变量的前面加一个减号。
创建了一个新的数据集,其中各行依经理人的年龄升序排序
创建一个数据集,其中各行依女性到男性、同样性别中按年龄排序
创建一个数据集,其中各行依女性到男性、同样性别中按年龄排序
九、数据集的合并
数据框中添加列(变量)和行(观测)的方法
添加列:
要横向合并两个数据框(数据集),请使用merge()函数。在多数情况下,两个数据框是通过一个或多个共有变量进行联结的。
将dataframeA和dataframeB按照ID进行了合并
#将dataframeA和dataframeB按照ID进行了合并
total <- merge(dataframeA,dataframeB,by="ID")
#将两个数据框按照ID和Country进行了合并
total <- merge(dataframeA,dataframeB,by=c("ID","Country"))
cbind()函数:
这个函数将横向合并对象A和对象B。为了让它正常工作,每个对象必须拥有相同的行数,且要以相同顺序排序。
添加行:
rbind()函数:
纵向合并两个数据框(数据集),使用两个数据框必须拥有相同的变量,不过它们的顺序不必一定相同。
#纵向合并两个数据框(数据集)
total <- rbind(dataframeA,dataframeB)
如果dataframeA中拥有dataframeB中没有的变量,请在合并它们之前做以下某种处理:
删除dataframeA中的多余变量;
在dataframeB中创建追加的变量并将其值设为NA(缺失)。
�十、数据集取子集
选入(保留)变量
结果:
剔除(丢弃)变量
第一种方法:
(1) names(leadership)生成了一个包含所有变量名的字符型向量:c("managerID","testDate","country","gender","age","q1", "q2","q3","q4","q5")。
(2) names(leadership) %in% c("q3", "q4")返回了一个逻辑型向量,names(leadership)中每个匹配q3或q4的元素的值为TRUE,反之为FALSE:c(FALSE, FALSE, FALSE, FALSE,FALSE, FALSE, FALSE, TRUE, TRUE, FALSE)。
(3) 运算符非(!)将逻辑值反转:c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE,FALSE, TRUE)。
(4) leadership[c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE,TRUE)]选择了逻辑值为TRUE的列,于是q3和q4被剔除了。
第二种方法:
在某一列的下标之前加一个减号()就会剔除那一列。
第三种方法:
将q3和q4两列设为了未定义(NULL)
选入观测
(1)逻辑比较leadership$gender=="M"生成了向量c(TRUE, FALSE, FALSE, TRUE,FALSE)。
(2)逻辑比较leadership$age > 30生成了向量c(TRUE, TRUE, FALSE, TRUE, TRUE)。
(3)逻辑比较c(TRUE, FALSE, FALSE, TRUE, TRUE) & c(TRUE, TRUE, FALSE, TRUE,TRUE)生成了向量c(TRUE, FALSE, FALSE, TRUE, FALSE)。
(4)函数which()给出了向量中值为TRUE元素的下标。因此,which(c(TRUE, FALSE,FALSE, TRUE, FALSE))生成了向量c(1, 4)。
(5) leadership[c(1,4),]从数据框中选择了第一个和第四个观测。这就满足了我们的选取准则(30岁以上的男性)。
使用了attach()函数不必在变量名前加上数据框名称。
希望将研究范围限定在2009年1月1日到2009年12月31日之间收集的观测。
Subset()函数
随机抽样
选择两份随机样本,使用其中一份样本构建预测模型,使用另一份样本验证模型的有效性。(一种很常见的建模方法)
sample()函数能够让你从数据集中(有放回或无放回地)抽取大小为n的一个随机样本。
sample()函数中的第一个参数是一个由要从中抽样的元素组成的向量。在这里,这个向量是1到数据框中观测的数量,第二个参数是要抽取的元素数量,第三个参数表示无放回抽样。
sample()函数会返回随机抽样得到的元素,之后即可用于选择数据框中的行。
参考文献 R in action
代码:
#代码一
#输入经理人数据
manager <- c(1,2,3,4,5)
#输入日期文件数据
date <- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
#输入国籍数据
country <- c("US","US","UK","UK","UK")
#输入性别数据
gender <- c("M","F","F","M","F")
#输入年龄数据
age <- c(32,45,25,39,99)
#输入q1到q5的评分数据
q1 <- c(5,3,3,3,2)
q2 <- c(4,5,5,3,2)
q3 <- c(5,2,5,4,1)
q4 <- c(5,5,5,NA,2)
q5 <- c(5,5,2,NA,1)
#创建数据列表
leadership <- data.frame(manager,date,country,gender,age,
q1,q2,q3,q4,q5,stringsAsFactors = FALSE)
#代码二
#创建数据框mydata
mydata <- data.frame(x1 = c(2,2,6,4),
x2 = c(3,4,2,8))
#方法一
mydata$sumx <- mydata$x1 + mydata$x2
mydata$meanx <- (mydata$x1 + mydata$x2)/2
代码三
#创建数据框mydata
mydata <- data.frame(x1 = c(2,2,6,4),
x2 = c(3,4,2,8))
#方法二
attach(mydata)
mydata$sumx <- x1 + x2
mydata$meanx <- (x1+x2)/2
detach(mydata)
#代码四
#创建数据框mydata
mydata <- data.frame(x1 = c(2,2,6,4),
x2 = c(3,4,2,8))
#方法三
mydata <- transform(mydata,
sumx = x1 +x2,
meanx = (x1 + x2)/2)
#代码五
#输入经理人数据
manager <- c(1,2,3,4,5)
#输入日期文件数据
date <- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
#输入国籍数据
country <- c("US","US","UK","UK","UK")
#输入性别数据
gender <- c("M","F","F","M","F")
#输入年龄数据
age <- c(32,45,25,39,99)
#输入q1到q5的评分数据
q1 <- c(5,3,3,3,2)
q2 <- c(4,5,5,3,2)
q3 <- c(5,2,5,4,1)
q4 <- c(5,5,5,NA,2)
q5 <- c(5,5,2,NA,1)
#创建数据框
leadership <- data.frame(manager,date,country,gender,age,
q1,q2,q3,q4,q5,stringsAsFactors = FALSE)
#将99岁的年龄值重编码为缺失值
leadership$age[leadership$age == 99] <- NA
#进行对连续型变量age进行重编码为agecat(Young、Middle Aged、Elder)
leadership$agecat[leadership$age > 75] <- "Elder"
leadership$agecat[leadership$age >= 35 &
leadership$age <= 75] <- "Middle Aged"
leadership$agecat[leadership$age < 35] <- "Young"
#代码六
#输入经理人数据
manager <- c(1,2,3,4,5)
#输入日期文件数据
date <- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
#输入国籍数据
country <- c("US","US","UK","UK","UK")
#输入性别数据
gender <- c("M","F","F","M","F")
#输入年龄数据
age <- c(32,45,25,39,99)
#输入q1到q5的评分数据
q1 <- c(5,3,3,3,2)
q2 <- c(4,5,5,3,2)
q3 <- c(5,2,5,4,1)
q4 <- c(5,5,5,NA,2)
q5 <- c(5,5,2,NA,1)
#创建数据框
leadership <- data.frame(manager,date,country,gender,age,
q1,q2,q3,q4,q5,stringsAsFactors = FALSE)
leadership <- within(leadership,{
agecat <- NA
agecat[age > 75] <- "Elder"
agecat[age >= 35 & age <= 75] <- "Middle Aged"
agecat[age < 35] <- "Young" })
#代码七
#输入经理人数据
manager <- c(1,2,3,4,5)
#输入日期文件数据
date <- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
#输入国籍数据
country <- c("US","US","UK","UK","UK")
#输入性别数据
gender <- c("M","F","F","M","F")
#输入年龄数据
age <- c(32,45,25,39,99)
#输入q1到q5的评分数据
q1 <- c(5,3,3,3,2)
q2 <- c(4,5,5,3,2)
q3 <- c(5,2,5,4,1)
q4 <- c(5,5,5,NA,2)
q5 <- c(5,5,2,NA,1)
#创建数据框
leadership <- data.frame(manager,date,country,gender,age,
q1,q2,q3,q4,q5,stringsAsFactors = FALSE)
names(leadership)
#将testDate替换leadership中的第二个名称。
names(leadership)[2] <- "testData"
Leadership
#代码八
#输入经理人数据
manager <- c(1,2,3,4,5)
#输入日期文件数据
date <- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
#输入国籍数据
country <- c("US","US","UK","UK","UK")
#输入性别数据
gender <- c("M","F","F","M","F")
#输入年龄数据
age <- c(32,45,25,39,99)
#输入q1到q5的评分数据
q1 <- c(5,3,3,3,2)
q2 <- c(4,5,5,3,2)
q3 <- c(5,2,5,4,1)
q4 <- c(5,5,5,NA,2)
q5 <- c(5,5,2,NA,1)
#创建数据框
leadership <- data.frame(manager,date,country,gender,age,
q1,q2,q3,q4,q5,stringsAsFactors = FALSE)
#识别数据框中的第六列到第十列
is.na(leadership[,6:10])
#代码九
x <- c(1,2,NA,3)
y <- x[1]+x[2]+x[3]+x[4]
z <- sum(x)
x <- c(1,2,NA,3)
#计算之前去除NA值
y <- sum(x,na.rm=TURE)
#代码十
#输入经理人数据
manager <- c(1,2,3,4,5)
#输入日期文件数据
date <- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
#输入国籍数据
country <- c("US","US","UK","UK","UK")
#输入性别数据
gender <- c("M","F","F","M","F")
#输入年龄数据
age <- c(32,45,25,39,99)
#输入q1到q5的评分数据
q1 <- c(5,3,3,3,2)
q2 <- c(4,5,5,3,2)
q3 <- c(5,2,5,4,1)
q4 <- c(5,5,5,NA,2)
q5 <- c(5,5,2,NA,1)
#创建数据框
leadership <- data.frame(manager,date,country,gender,age,
q1,q2,q3,q4,q5,stringsAsFactors = FALSE)
leadership
#创建newdata,仅包含完整观测值
newdata <- na.omit(leadership)
newdata
#代码十一
#简单的输入一个日期,默认格式为yyyy-mm-dd
mydates <- as.Date(c("2007-06-22","2004-02-13"))
Mydates
Sys.Date()
date()
#代码十二
#定义a
a <- c(1,2,3)
a
#判断a是不是数值型
is.numeric(a)
#判断a是不是向量
is.vector(a)
#将a转换为字符串型
a <- as.character(a)
a
#判断a是不是数值型
is.numeric(a)
#判断a是不是向量
is.vector(a)
#判断a是不是字符串型
is.character(a)
#代码十三
#对leadership中的age进行排序
newdata <- leadership[order(leadership$age)]
Newdata
#创建一个数据集
attach(leadership)
#其中各行依女性到男性、同样性别中按年龄排序
newdata <- leadership[order(gender,age),]
detach(leadership)
#创建一个数据集
attach(leadership)
#将各行依经理人的性别和年龄降序排序
newdata <- leadership[order(gender,-age),]
detach(leadership)
#代码十四
#从leadership数据框中选择了变量q1、q2、q3、q4和q5,并将它们保存到了数据框newdata
#行下标留空(,)表示默认选择所有行。
#第一种语句
newdata <- leadership[,c(6:10)]
#第二终于语句
myvars <- c("q1","q2","q3","q4","q5")
newdata <- leadership[myvars]
#第三种语句
myvars <- paste("q",1:5,sep="")
newdata <- leadership[myvars]
#代码十五
myvars <- names(leadership) %in% c("q3","q4")
newdata <- leadership[!myvars]
leadership <- leadership <- NULL
newdata <- leadership[c(-8,-9)]
#代码十六
newdata <- leadership[1:3,]
newdata <- leadership[which(leadership$gender=="M"&leadership$age > 30)]
attach(leadership)
newdata <- leadership[which(gender=='M'& age > 30)]
detach (leadership)
#代码十七
#,使用格式mm/dd/yy将开始作为字符值读入的日期转换为日期值
leadership$data <- as.Date(leadership$date,"%m/%d%y")
#创建开始日期和结束日期
startdate <- as.Date("2009-01-01")
enddata <- as.Date("2009-10-31")
#将研究范围限定在2009年1月1日到2009年12月31日之间收集的观测上
newdata <- leadership[which(leadership$date>=startdate &
leadership$date <= enddata),]
#代码十八
#选择了所有age值大于等于35或age值小于24的行,保留了变量q1到q4
newdata <- subset(leadership,age >= 35 | age <24,
select = c(q1,q2,q3,q4))
#选择了所有25岁以上的男性,并保留了变量gender到q4(gender、q4和其
#间所有列)
#冒号运算符from:to表示了数据框中变量from到变量to包含的所有变量
newdata <- subset(leadership,gendar=="M" & age >25,
select = gender:q4)