以下的操作主要就是针对上面的数据进行处理
一、根据已有数据创建新的变量
使用以下运算符+,-,*,/,^,%%,%/%
一共有三种方式
(1)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
(2)attach(mydata)
mydata$sumx <- x1 + x2
mydata$meanx <- (x1 + x2)/2
detach(mydata)
(3)mydata <- transform(mydata, sumx = x1 + x2, meanx = (x1 +
x2)/2)
为数据框mydata增加二个新的变量,sumx,meanx
二、变量的重编码
(1)处理缺失值,异常值
(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")
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, gender, age,
q1, q2, q3, q4, q5, stringsAsFactors = FALSE)
首先将99这个异常值赋予NA
leadership$age[leadership$age == 99] <-NA
然后将年龄离散化
leadership <- within(leadership, {
agecat <- NA
agecat[age > 75] <- "Elder"
agecat[age >= 55 & age <= 75] <- "Middle Aged"
agecat[age < 55] <- "Young"
})
car包中的recode()函数可以十分简便地重编码数值型、字符型向量或因子。而doBy包提供了另外一个很受欢迎的函数recodevar()。最后,R中也自带了cut(),可将一个数值型变量按值域切割为多个区间,并返回一个因子
三、变量的重命名
(1)fix(leadership)
(2)library(reshape)
rename(leadership, c(manager = "managerID", date = "testDate"))
(3)names(leadership)
四、缺失值的判定以及处理
(1)直接删除整条记录
(2)人工填写统一的值
(3)填写该变量的均值
(4)填写该变量同类别的均值
(5)使用线性回归计算,估计出该值
y<-c(1,2,3,NA)
is.na(y) false,false,false,true
如何在计算的过程中提出NA值?
x<-sum(y,na.rm=true) //删除y向量中为NA的值
删除有NA的行
leadership <- na.omit(leadership)
五、对日期的处理
lubridate包中包含了许多简化日期处理的函数,可以用于识别和解析日期-时间数据,抽取日期—时间成分(例如年份、月份、日期等),以及对日期—时间值进行算术运算。如果你需要对日期进行复杂的计算,那么fCalendar包可能会有帮助。它提供了大量的日期处理函数,可以同时处理多个时区,并且提供了复杂的历法操作功能,支持工作日、周末以及假期
将字符串转化为日期
as.Date(x,format)
mydates <- as.Date(c("2007-06-22", "2004-02-13"))
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() 当前的日期
today <- format(today,format) 将日期格式化为指定的format
startdate <- as.Date("2004-02-13")
enddate <- as.Date("2009-06-22")
days <- enddate - startdate
days 是指定二个日期相差的天数
today <- Sys.Date()
format(today, format = "%B %d %Y")
dob <- as.Date("1956-10-10")
format(dob, format = "%A")
六、验证类型以及转化类型
R语言中的类型主要有numeric,character,logical,虚数类型,原生类型。
a <- c(1, 2, 3)
a
is.numeric(a)
is.vector(a)
a <- as.character(a)
a
is.numeric(a)
is.vector(a)
is.character(a)
七、数据集的排序
order() 对数据框的某一列排序,或者 几列之间从前到后排序
attach(leadership)
newdata <- leadership[order(age), ]
newdata
detach(leadership)
attach(leadership)
newdata <- leadership[order(gender, -age), ]
newdata
detach(leadership)
八、数据集之间的合并
按照行合并以及按照列合并
合并列
(1)newdata <- merge(dataA,dataB,by=c("ID","Country"))
dataA,dataB 二个数据集按照ID和Country二个相同的列进行合并,其它的列加入
保证dataA,dataB的行数是一样的
(2)cbind(dataA,dataB)
合并行
rbind(dataA,dataB)
九、数据集的子集的选取
(1)选择数据框的一些列
newdata <- leadership[,c(6:10)]
newdata<-leadership[c("q1","q2","q3")] 根据名字选取想要的列
(2)删除一些变量(删除q3,q4二列)
myvars <- names(leadership) %in% c("q3", "q4")
newdata <- leadership[!myvars]
leadership$q3 <- leadership$q4 <- NULL
(3)选择一些行
newdata <- leadership[1:3, ]
newdata <- leadership[which(leadership$gender == "M" &
leadership$age > 30), ]
attach(leadership)
newdata <- leadership[which(leadership$gender == "M" &
leadership$age > 30), ]
detach(leadership)
只要在指定日期的数据
leadership$date <- as.Date(leadership$date, "%m/%d/%y")
startdate <- as.Date("2009-01-01")
enddate <- as.Date("2009-10-31")
newdata <- leadership[leadership$date >= startdate &
leadership$date <= enddate, ]
使用subset()函数,更好的处理取变量以及取行
newdata <- subset(leadership, age >= 35 | age < 24,
select = c(q1, q2, q3, q4))
newdata <- subset(leadership, gender == "M" & age >
25, select = gender:q4)
十、随机抽样
R中拥有齐全的抽样工具,包括抽取和校正调查样本(参见sampling包)以及分析复杂调查数据(参见survey包)的工具。其他依赖于抽样的方法,包括自助法和重抽样统计方法
sample()函数主要用于抽样
mysample<-leadership[sample(1:nrow(leadership),3,replace=FALSE),]
nrow(leaedership) 数据集有多少条记录
3 表示要抽样的个数
replace=false 无放回抽样
十一、使用sql查询数据框,得到想要的数据集
library(sqldf)
newdf <- sqldf("select * from mtcars where carb=1 order by mpg",
row.names = TRUE)
newdf <- sqldf("select avg(mpg) as avg_mpg, avg(disp) as avg_disp,
gear from mtcars where cyl in (4, 6) group by gear")
十二、如何对数据集处理
(1)将矩阵转置t()
cars <- mtcars[1:5, 1:4]
cars
t(cars)
(2)整合数据
aggregate(x,by,fun)
options(digits=3)
attach(mtcars)
aggdata <-aggregate(mtcars, by=list(cyl,gear),
FUN=mean, na.rm=TRUE)
aggdata
reshape包①是一套重构和整合数据集的绝妙的万能工具