R语言对数据的基本管理

时间:2021-12-11 01:45:58

R语言对数据的基本管理

以下的操作主要就是针对上面的数据进行处理

一、根据已有数据创建新的变量

使用以下运算符+,-,*,/,^,%%,%/%

一共有三种方式

(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包可能会有帮助。它提供了大量的日期处理函数,可以同时处理多个时区,并且提供了复杂的历法操作功能,支持工作日、周末以及假期

R语言对数据的基本管理

将字符串转化为日期

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,虚数类型,原生类型。

R语言对数据的基本管理

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包①是一套重构和整合数据集的绝妙的万能工具