如果想创建一个储存当前数据库内数据运算后结果的变量到数据框中
使用within()函数(可以修改数据框中的变量)
> mydata <- data.frame(x1=c(2,2,6,4),x2=c(3,4,2,8))
> mydata <- within(mydata,{
+ sumx <- x1+x2
+ meanx <- (x1+x2)/2
+ })
> mydata
x1 x2 meanx sumx
1 2 3 2.5 5
2 2 4 3.0 6
3 6 2 4.0 8
4 4 8 6.0 12
还可以使用transform()函数。*注意:在向数据库中添加新变量时,使用transform()函数比其他函数使用起来更加简便。sumx和meanx后接的是等号而不是赋值符号,将新变量作为函数内的选项。
> rm(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)
> str(mydata)
'data.frame': 4 obs. of 4 variables:
$ x1 : num 2 2 6 4
$ x2 : num 3 4 2 8
$ sumx : num 5 6 8 12
$ meanx: num 2.5 3 4 6
常用的逻辑运算符见书P71。
在希望对变量的现有值创建新值时,需要对变量值进行重编码并且将其储存为数据库的新变量值。
举例:
> 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 <- 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
manager date country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
4 4 10/12/08 UK M 39 3 3 4 NA NA
5 5 5/1/09 UK F 99 2 2 1 2 1
现在想对受调查者的年龄进行分层,分选为“Young”,“Middle aged”,“Elder”。
使用within()函数
> leadership <- within(leadership,{
+ agecat <- NA
+ agecat [age>75] <- "Elder"
+ agecat[age<=75 & age>=55] <- "Middle aged"
+ agecat[age<55] <- "Young"
+ })
> leadership
manager date country gender age q1 q2 q3 q4 q5 agecat
1 1 10/24/08 US M 32 5 4 5 5 5 Young
2 2 10/28/08 US F 45 3 5 2 5 5 Young
3 3 10/1/08 UK F 25 3 5 5 5 2 Young
4 4 10/12/08 UK M 39 3 3 4 NA NA Young
5 5 5/1/09 UK F 99 2 2 1 2 1 Elder
*注意:首先创建agecat变量以后要将agecat中的变量设为NA再依次执行语句,否则:
> leadership <- within(leadership,{
+ agecat [age>75] <- "Elder"
+ agecat[age<=75 & age>=55] <- "Middle aged"
+ agecat[age<55] <- "Young"
+ agecat[age==99] <- NA
+ })
Error in agecat[age > 75] <- "Elder" : object 'agecat' not found
会出现agecat不存在的提示
对于manager 5 中年龄=99可以认为是错误值,在进行分选之前先将99设置为NA,或者在对Elder设置范围时增加上限。
最简单的方式就是使用fix()函数调出对话框,在框中直接进行变量重命名。
其次,是可以用names()函数:
> names(leadership)
[1] "manager" "date" "country" "gender" "age" "q1" "q2" "q3" "q4" "q5" "agecat"
> names(leadership)[2] <- "testDate"
> names(leadership)
[1] "manager" "testDate" "country" "gender" "age" "q1" "q2" "q3" "q4" "q5"
[11] "agecat"
然后,是使用plyr包中的rename()函数,格式为rename (mydata, c(oldname="newname",...))
> library(plyr)
> leadership <- rename(leadership,c(manager="managerID",testDate="Date"))
> leadership
managerID Date country gender age q1 q2 q3 q4 q5 agecat
1 1 10/24/08 US M 32 5 4 5 5 5 Young
2 2 10/28/08 US F 45 3 5 2 5 5 Young
3 3 10/1/08 UK F 25 3 5 5 5 2 Young
4 4 10/12/08 UK M 39 3 3 4 NA NA Young
5 5 5/1/09 UK F 99 2 2 1 2 1 Elder
可以使用is.na()函数来判断数据中是否有缺失值,也可以使用 [] 定位到某行和列来缩小搜索范围。
例如:
> is.na(leadership[6:10])
q1 q2 q3 q4 q5
1 FALSE FALSE FALSE FALSE FALSE
2 FALSE FALSE FALSE FALSE FALSE
3 FALSE FALSE FALSE FALSE FALSE
4 FALSE FALSE FALSE TRUE TRUE
5 FALSE FALSE FALSE FALSE FALSE
缺失值会返回为TRUE
*注意:缺失值无法被用来进行比较,且R不会把无法出现或者无限的值标记为缺失值。
缺失值可以使用函数中na.rm=TRUE选项来排除,排除以后可以进行运算。
而na.omit()函数可删除不完整的观测
> na.omit(leadership)
managerID Date country gender age q1 q2 q3 q4 q5 agecat
1 1 10/24/08 US M 32 5 4 5 5 5 Young
2 2 10/28/08 US F 45 3 5 2 5 5 Young
3 3 10/1/08 UK F 25 3 5 5 5 2 Young
5 5 5/1/09 UK F 99 2 2 1 2 1 Elder
常用的日期格式见书P76
将日期以字符串的形式输入到R中,使用as.Date()函数可将字符串转换为日期变量。
例如
> mydates <- c("01/05/1965","08/16/1965")
> dates <- as.Date(mydates,"%m/%d/%Y")
> dates
[1] "1965-01-05" "1965-08-16"
“”中的为mydates中日期的输入形式,asDate函数会将日期转化为默认格式yyyy-mm-dd
可以使用as.character()函数将日期转化为字符串
常用的类型判断和转换函数见书P78,有numeric,character,vector,matrix,data.frame,factor,logical
可以使用order()函数对一个数据进行排序,默认是升序排列,在排序变量前加减号(-)可以变为降序排列。
> leadership[order(age),]
managerID Date country gender age q1 q2 q3 q4 q5 agecat
3 3 10/1/08 UK F 25 3 5 5 5 2 Young
1 1 10/24/08 US M 32 5 4 5 5 5 Young
4 4 10/12/08 UK M 39 3 3 4 NA NA Young
2 2 10/28/08 US F 45 3 5 2 5 5 Young
5 5 5/1/09 UK F 99 2 2 1 2 1 Elder
*注意:order函数应该在方括号内(指定按照列还是行进行排序)
可以使用merge()函数对两个数据框进行横向连接,依据是使用两个数据框中的共有变量
total <- merge (dataframeA,dataframeB,by="ID")
上例中是让A和B数据框按照ID这一相同变量进行合并
还有cbind(A, B)函数,也是横向合并(c=column),且不需要指定公共索引,但是需要保证每个对象的行数相同并且以相同的顺序排列。
rbind(A,B)函数可以实现这一目标,但是对象中的变量必须一致,顺序可以不一致;若A或者B中有多余变量,要对数据进行预处理:
1. 删除A或B的多余变量
2. 在B或者A中追加新变量,并且设值为NA
> newdata <- leadership[,c(6:10)]
> newdata
q1 q2 q3 q4 q5
1 5 4 5 5 5
2 3 5 2 5 5
3 3 5 5 5 2
4 3 3 4 NA NA
5 2 2 1 2 1
选取原数据框中的行和列即可
还可以
> myvar <- c("q1","q2","q3","q4","q5")
> newdata <- leadership[myvar]
> newdata
q1 q2 q3 q4 q5
1 5 4 5 5 5
2 3 5 2 5 5
3 3 5 5 5 2
4 3 3 4 NA NA
5 2 2 1 2 1
myvar引号中的变量名在leadership[]中充当了列的下标
还可以
> myvar <- paste("q",1:5,sep="")
> newdata <- leadership[myvar]
> newdata
q1 q2 q3 q4 q5
1 5 4 5 5 5
2 3 5 2 5 5
3 3 5 5 5 2
4 3 3 4 NA NA
5 2 2 1 2 1
使用paste()函数连接字符串(意思为用“”中的内容连接q和1到5的数字)
> myvar <- names(leadership)%in%c("q3","q4")#首先names(leadership)返回了一个字符型变量,包含了leadership中所有的变量名,然后%in%后返回了一个逻辑型变量,在q3和q4的元素值都为TRUE
> newdata <- leadership[!myvar]#!将逻辑值反转,使q3和q4的元素值都为FALSE,leadership[]选择逻辑值为TRUE的值,则q3和q4被剔除
> newdata
managerID Date country gender age q1 q2 q5 agecat
1 1 10/24/08 US M 32 5 4 5 Young
2 2 10/28/08 US F 45 3 5 5 Young
3 3 10/1/08 UK F 25 3 5 2 Young
4 4 10/12/08 UK M 39 3 3 NA Young
5 5 5/1/09 UK F 99 2 2 1 Elder
弄清上述方法的逻辑顺序!
或者,在知道q3和q4是第8,9个变量时,使用如下语句
> newdata <- leadership[c(-8,-9)]
> newdata
managerID Date country gender age q1 q2 q5 agecat
1 1 10/24/08 US M 32 5 4 5 Young
2 2 10/28/08 US F 45 3 5 5 Young
3 3 10/1/08 UK F 25 3 5 2 Young
4 4 10/12/08 UK M 39 3 3 NA Young
5 5 5/1/09 UK F 99 2 2 1 Elder
在列数前面加上减号(-),将列剔除
1.可以选入行下标,留空列下标,表示所有列皆被选入
> newdata <- with(leadership,leadership[gender=="M" & age>30,])
> newdata
managerID Date country gender age q1 q2 q3 q4 q5 agecat
1 1 10/24/08 US M 32 5 4 5 5 5 Young
4 4 10/12/08 UK M 39 3 3 4 NA NA Young
以上是使用with()函数进行的,还可以使用attach()函数,入选的观测为1和4
2. 使用subset()函数
> rm(newdata)
> newdata <- subset(leadership,age>=35 | age< 24,select = age:q5)
> newdata
age q1 q2 q3 q4 q5
2 45 3 5 2 5 5
4 39 3 3 4 NA NA
5 99 2 2 1 2 1
select=选项保留选中的列
使用函数sample()从数据集中抽样
> mysample <- leadership[sample(1:nrow(leadership),3,replace = FALSE),]
> mysample
managerID Date country gender age q1 q2 q3 q4 q5 agecat
4 4 10/12/08 UK M 39 3 3 4 NA NA Young
2 2 10/28/08 US F 45 3 5 2 5 5 Young
3 3 10/1/08 UK F 25 3 5 5 5 2 Young
#replace=FALSE 表示不放回抽样,1:nrow(leadership)表示选中所有观测,3为抽样数目