#创建数据框
#注意 stringsAsFactors = FALSE 大小写,以及间距,否则将作为新列插入
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)
str(leadership)
#变量的重编码,within 与 with 类似,但within支持对dataframe进行结构修改
leadership <- within(leadership,{
agecat <- NA
agecat[age > 75] <- "Elder"
agecat[age >= 55 & age <=75] <- "Middle Aged"
agecat[age < 55] <- "Young"
}
)
#缺失值
#两种错误形式:
myvar <- NA
myvar == NA
#对于无限值 Inf -Inf
sin(Inf) #返回NaN not a number
is.infinite(-Inf) #返回True
is.nan(-Inf) #返回False
is.na(leadership[,6:10]) #判断df第6列到第10列中是否有缺失值
#重编码缺失值
leadership$age[leadership$age == 99] <- NA
#变量的重命名
names(leadership) #返回所有列名
names(leadership)[2] <- "testDate" #列名向量修改列名
#引用plyr数据包
install.packages("plyr")
library(plyr)
rename(leadership,c(manager="managerID",testDate="TestDate"))
#创建新变量
#方法一
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
#方法二
attach(mydata)
mydata$sumx <- x1 + x2
mydata$meanx <- (x1+x2)/2
detach(mydata)
#方法三
mydata <- transform(mydata,
sumx = x1 +x2,
meanx = (x1+x2)/2)
#分析过程中排除缺失值
#含有缺失值的算术表达式和函数的计算结果也是缺失值
x <- c(1,2,NA,3)
y <- x[1]+x[2]+x[3]+x[4]
z <- sum(x)
y <- sum(x,na.rm = TRUE) #排除缺失值后,结果正确
#原始记录直接进行行删除,na.omit(),将含有缺失值的行全部删除,原记录不被修改
leadership
newdata <- na.omit(leadership)
#日期值
mydates <- as.Date(c("2007-06-22","2004-02-13"))
class(mydates) #返回Date类型
Sys.Date() #返回当天的日期 "2018-12-17"
date() #返回当前的日期和时间 "Mon Dec 17 12:20:40 2018"
#格式参数说明
# %d 数字表示的日期,0-31
# %a 缩写的星期名
# %A 非缩写的星期名
# %m 月份(00-12)
# %b 英文缩写的月份
# %B 英文非缩写的月份
# %y 两位数的年份
# %Y 四位数的月份
strDates <- c("01/05/1965","08/16/1975")
dates <- as.Date(strDates,"%m/%d/%Y") #按格式转换
myformat <- "%m/%d/%y"
leadership$date <- as.Date(leadership$date,myformat)
#时间信息截取
today <- Sys.Date()
format (today,format = "%B %d %Y") #仅解析,原始变量不变
format (today,format = "%A")#提取,星期信息,中文系统显示"星期一"
#R中,1970年1月1日,为第一天
startdate <- as.Date("2004-02-13")
enddate <- as.Date("2011-01-22")
days <- enddate - startdate
#参数解释
?difftime
example(difftime)
#auto 随机选择
#secs 秒
#mins 分钟
#hours 小时
#days 天
#weeks 周
difftime(enddate,startdate,units="weeks")
format(as.Date("1956-10-12"),format="%A") #反馈星期五
strDates <- as.character(Sys.Date()) #日期强制转换成字符串
class(strDates)
#强制类型转换
a <- is.numeric("1") #判断是否数值类型
b <- as.numeric("1") #字符1,转换成数值1
is.character()
as.character()
is.vector()
as.vector()
is.matrix()
as.matrix()
is.data.frame()
as.data.frame()
is.factor()
as.factor()
is.factor()
as.factor()
is.logical()
as.logical()
#数据排序
attach(leadership)
newdata <- leadership[order(gender,-age),] #性别升序,同性别时,按照年龄降序
detach(leadership)
#数据集的合并,merge 相当于inner join
myID <- c(1,3,5)
myCountry <- c("US","China","Canada")
myname <- c("Jane","Helen","Tom")
mysex <- c("Femal","Male")
myID <- c(1,8)
myCountry <- c("US","Canada")
df1 <- data.frame(myID,myCountry,myname)
df2 <- data.frame(myID,mysex) #重新给myID赋值后,再次执行
df3 <- data.frame(myID,myCountry,mysex) #重新给myID赋值后,再次执行
total <- merge(df1,df2,by="myID") #基于一个列名合并
total <- merge(df1,df3,by=c("myID","myCountry")) #基于多个列名
#cbind,横向合并,添加变量(列)
myid <- c(1,2)
myc <- c("US","Canada")
mys <- c("Femal","Male")
df4 <- data.frame(myid,myc,mys)
myid2 <- c(3,4)
myc2 <- c("China","America")
mys2 <- c("Femal","Male")
df5 <- data.frame(myid2,myc2,mys2)
total2 <- cbind(df4,df5) #要求行数相等,最终行数不变,列数相加
#rbind,纵向合并,添加观测(行)
myid <- c(1,2)
myc <- c("US","Canada")
mys <- c("Femal","Male")
df6 <- data.frame(myid,myc,mys)
myid <- c(3,4)
myc <- c("China","America")
mys <- c("Femal","Male")
df7 <- data.frame(myid,myc,mys)
total3 <- rbind(df6,df7) #要求列相同,顺序不做要求,最终行数增加,列数不变
#保留变量
newdata <- leadership[,c(6:10)] #选取第6列到第10列数据,行没要求
myvars <- c("q1","q2","q3","q4","q5")
myvars <- paste("q",1:5,sep="") #反馈:"q1" "q2" "q3" "q4" "q5"
newdata <- leadership[myvars] #选取第6列到第10列数据,行没要求
#剔除变量
#方法一
myvars <- names(leadership) %in% c("q3","q4")
newdata <- leadership[!myvars] #剔除q3,q4列数据
#方法二
newdata <- leadership[c(-8,-9)]
#df抽样
#df中按照条件选择记录,条件放于逗号以前,行过滤的位置
newdata <- leadership[1:3,] #选择前三行
attach(leadership)
newdata <- leadership[gender=='M' & age >30,]
detach(leadership)
#subset函数
newdata <- subset(leadership,age >= 35|age <24,
select = c(q1,q2,q3,q4)
) #选择age大于等于35,或者age 小于24,保留的列为q1,q2,q3,q4
newdata <- subset(leadership,gender=="M" & age >25,
select = gender:q4
)#选择age大于等于25,并且gender等于M,保留的列为从gender到q4
#随机抽样
myrows <- sample(1:nrow(leadership),3,replace=FALSE) #从有效行号中随机抽取3个
mysample <- leadership[myrows,] #根据行号,抽取对应观测
#使用sqldf包,操作数据框,相当于把数据框当成一个表格
install.packages("sqldf")
library("gsubfn")
library("proto")
library("RSQLite")
library("sqldf") #需要先行加载依赖的包
newdf <- sqldf("select * from mtcars where carb=1 order by mpg",
row.names=TRUE
)#简单的查询
newdf2 <- sqldf("select avg(mpg) as avg_mpg,avg(disp) as avg_disp,
gear from mtcars
where cyl in (4,6) group by gear"
)#聚合的查询