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<-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)
stringsAsFactors=FALSE:
String是字符串,可用于记录琐细信息,Factor是因子,用于给一行记录做"分类标记",对于Factor类型属性,R语言可以自动统计数据的factor水平(level),比如:男,女分别有多少。stringsAsFactors = F意味着,"在读入数据时,遇到字符串之后,不将其转换为factors,仍然保留为字符串格式"。在读入数据框之后,仍然有机会可以对数据框的列进行factors转换的操作。
1.创建新变量
*运算符:+,-,*,/,^,x%%y,x%/y%
mydata<-data.frame(x1=c(2,2,6,4),x2=c(3,4,2,8))
1)mydata$sumx<-mydata$x1+mydata$x2
2)mydata<-transform(mydata,meanx=(x1+x2)/2) #transform函数
2.变量重编码
*运算符:<,<=,>,>=,!=,==,!x,x|y,x&y,isTRUE(x)
①连续型变量修改为一组类别值
②错误编码替换成正确的
③基于一组分组线创建一个类似及格/不及格的变量
leadership$age[leadership$age==99]<-NA #异常值记为NA,防止被错误分类
leadership$agecat[leadership$age>75]<-"Elder"
leadership$agecat[leadership$age>=55 & leadship$age<=75]<-"Middle Age"
leadership$agecat[leadership$age<55]<-"Young"
3.变量重命名
1)fix(leadership)
2)name(leadership) #查看表
name(leadership)[2]<-"testDate" #修改对应列的变量名
3)name(leadership)[1:3]<-c("bianhao","riqi","guojia") #批量修改
4.缺失值
1)leadership$age[leadship$age==99]<-NA #将异常值确定为缺失值
2)is.na(leadership[,6:10]) #is.na()函数查找缺失值
3)排除缺失值:
①x<-c(1,2,NA) ¿ y<-sum(x,na.rm=TRUE) #na,rm=TRUE不将NA值计算在内
②na.omit(leadership) #na.omit()函数删除包含NA的观测
5.日期值
*Sys.Date() #返回当天日期 date() #返回当前日期
符号 |
含义 |
%d |
数字表示的日期,01-31 |
%a |
所写的星期名,Mon |
%A |
完整的星期名,Monday |
%m |
月份,00-12 |
%b |
所写的月份,Jan |
%B |
完整的月份,January |
%y |
两位数的年份,07 |
%Y |
完整的年份,2007 |
1)myformat<"-%m/d%/y" #定义日期格式
2)leadership$date<-as.Date(leadership$date,myformat) #调整为myformat格式
6.类型转换
判断 |
转换 |
备注 |
is.numeric() |
as.numeric() |
数值 |
is.character() |
as.character() |
字符 |
is.vector() |
as.vector() |
向量 |
is.matrix() |
as.matrix() |
矩阵 |
is.data.frame() |
as.data.frame() |
数据框 |
is.factor() |
as.factor() |
因子 |
is.logical() |
as.logical() |
逻辑 |
7.数据排序
*默认升序,在排序变量前加-改为降序
attach(leadership) #绑定表
newdata<-leadership[order(gender, -age),] #设定排序,此处符号勿忘
detach(leadership) #解绑
8.数据合并
①横向合并,且有公共索引 #merge()函数有索引的横向合并
total<-merge(dataframeA, dataframeB, by="ID")
total<-merge(dataframeA, dataframeB, by=c("ID","Country"))
②横向合并,无公共索引直接拼接 #cbind()函数横向拼接
total<-cbind(dataframeA, dataframeB)
③纵向合并 #rbind()函数纵向拼接
total<-rbind(dataframeA, dataframeB)
两者要有相同的变量,不一定要顺序相同,如果A中有B中没有的变量,可以先删除A中多余的变量,或者在B中追加变量并设置为NA
9.子集相关
①保留变量
1)temp<-c("q1","q2","q3","q4","q5")
2)newdata<-leadership[temp] #或者在知道位置的情况下
newdata<-leadership[c(6:10)]
②剔除变量
1)temp<-c("q1","q2","q3","q4","q5")
2)newdata<-leadership[!temp] #同保留
③选取观测
newdata<-leadership[1:3,] #选取前三个观测,选择变量的话,在前
newdata<-leadership[leadership$gender=="M"] #选取男性
或者:
attach(leadership) #用绑定可以省略掉下方的数据框名称
newdata<-leadership[gender=="M" & age>30] #选取三十岁以上的男性
detach(leadership)
④subset()函数
newdata<-subset(leadership, age>=35|age<20, select=c(q1,q2,q3))
#此处q1,q2,q3没有用"",加上""也可以正常执行,与上方不一致,原因暂时未知 18/7/12
newdata<-subset(leadership, age>=35|age<20, select=c(gender:q5))
⑤随机抽样
mysample<-leadership[sample(1:nrow(leadership),3,replace=FALSE),]
10.利用SQL语句操作
装sqldf包后:sample<-sqldf("select * from leadership where manager=1")