《R语言实战笔记》第四章:基本数据管理

第四章:基本数据管理

4.1一个示例

关于研究问题:“男性和女性在领导各自企业方式上的不同”,书作者给出了一个leadership数据框(具体内容见书P65)。

manager <- c(1: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)

4.2创建新变量

《R语言实战笔记》第四章:基本数据管理_第1张图片

mydata <- data.frame(x1 = c(2, 2, 6, 4), x2 = c(3, 4, 2, 8))
# 创建新变量并整合到原有数据框,有三种方法,详见书P67,这里只列出最推荐的方法三,即利用transform()函数
mydata <- transform(mydata, sumx = x1 + x2, meanx = (x1 + x2)/2)

4.3变量的重编码

《R语言实战笔记》第四章:基本数据管理_第2张图片

# 利用within()函数对数据框中的变量重编码
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' })
# 注意:within()与with()函数类似,但前者允许你修改数据框

若干程序包都提供实用的变量重编码函数 ,如car包中的recode()函数,doBy包的recodevar()函数,R自带的cut()函数。

4.4变量的重命名

# 方法一:利用fix()函数打开交互式编辑器,在编辑器中单击变量名,并重命名
fix(leadership)

# 方法二:利用reshape包的rename()函数修改变量名
rename(dataframe, c(oldname='newname', oldname='newname', ...)) # 调用rename()函数的一般格式
# 利用rename()函数重命名的示例:
library(reshape)
leadership <- rename(leadership, c(manager='managerID', date='testDate'))

# 方法三:利用names(数据框)[变量下标]来重命名变量
names(leadership)[2] <- 'testDate' # 重命名leadership的第二个变量为'testDate'
names(leadership)[6:10] <- c('item1', 'item2', 'item3', 'item4', 'item5') # 重命名leadership的q1到q5为item1到item5

4.5缺失值

在R中,缺失值用符号NA表示,不可能出现的值(如被0除的结果)用NaN表示。

# 利用is.na()函数可检测缺失值是否存在
is.na(leadership[,6:10]) # 逗号可以去掉

注意:缺失值不可比较,即无法通过比较运算符检测缺失值是否存在,只能通过如is.na()函数来识别缺失值。

4.5.2在分析中排除缺失值

# 利用数值函数的na.rm=TRUE在计算前移除缺失值并用剩余值进行计算
x <- c(1, 2, NA, 3)
y <- sum(x, na.rm=TRUE) # 移除缺失值后求和,结果为6
# 利用函数na.omit()移除所有含缺失值的观测
newdata <- na.omit(leadership)

4.6日期值

《R语言实战笔记》第四章:基本数据管理_第3张图片

# 将字符串类型的日期值转化为数值类型的日期变量
as.Date(x, 'input_format') # 调用as.Date()函数的一般格式;它可以将字符串类型的日期值转化为数值类型的日期变量,其中x是字符型数据,input_format则是读入数据的日期格式,默认输入格式为'%Y-%m-%d'
# 利用as.Date转化字符串类型日期值的示例:
mydates <- as.Date(c('2007-06-22', '2004-02-13')) # 将'%Y-%m-%d'格式的'2007-06-22'和'2004-02-13'转化为对应日期
dates <- as.Date(c('01/05/1965', '08/16/1975'), '%m/%d/%Y') # 将'%m/%d/%Y'格式的'01/05/1965'和'08/16/1975'转化为对应日期

# 返回当天的日期
Sys.Date()

# 返回当前的日期和时间
date()

# 将日期变量转化为指定格式的字符串(也可以用于提取日期值的部分)
format(Sys.Date(), format='%B %d %Y')

# 将日期变量转化为字符型变量
strDates <- as.character(dates)

# 在R中,日期值可以执行算术运算
days <- as.Date('2011-01-22') - as.Date('2004-02-13')

# 也可以利用difftime()函数计算时间间隔
difftime(Sys.Date(), as.Date('1956-10-12'), units='weeks') # 结果带小数点

4.7类型转换

《R语言实战笔记》第四章:基本数据管理_第4张图片

# 名为is.datatype()的函数返回TRUE或FALSE,可判断某个对象是否是某个数据类型
a <- c(1, 2, 3)
is.numeric(a) # 判断是否是数值类型的
is.vector(a)  # 判断是否是向量

a <- as.character(a) # 将参数转化为字符类型向量
is.numeric(a) # 判断是否是数值类型的
is.character(a) # 判断是否是字符类型的

4.8数据排序

# 利用order()函数可以对数据框进行排序,默认的排序顺序为升序
attach(leadership)
newdata <- leadership[order(gender, -age),] # 将数据框leadership按照gender升序,age降序排列,结果对象存入newdata中,列下标留空(',')表示默认选择所有列
detach(leadership)

4.9数据集的合并

4.9.1添加列

# 将数据框dataframeA和dataframeB通过'ID'和'Country'进行内联结
total <- merge(dataframeA, dataframeB, by=c('ID', 'Country'))
# 直接横向合并两个矩阵或数据框(必须保证两者有相同的行数,以及相同的顺序排序)
total <- cbind(A, B)

4.9.2添加行

# 将数据框dataframeA和dataframeB纵向合并(必须保证两者拥有相同的变量)
total <- rbind(dataframeA, dataframeB)

4.10数据集取子集

4.10.1选入(保留)变量

# 从一个大数据集中选择有限数量的变量来创建一个新的数据集的两种写法
# 一:引用变量的数量下标选择变量:从leadership中选择变量q1、q2、q3、q4和q5构成新的数据框,保存到newdata中,行下标留空(',')表示默认选择所有行
newdata <- leadership[, c(6:10)]

# 二:引号+变量名:# 从leadership中选择变量q1、q2、q3、q4和q5构成新的数据框
myvar <- paste('q', 1:5, sep='') # 利用paste()函数拼接字符串,得到向量c('q1', 'q2', 'q3', 'q4', 'q5')
newdata <- leadership[myvar]

4.10.2剔除(丢弃)变量

# 已知变量名,利用!names(leadership) %in% c(变量名)来剔除变量
names(leadership) # 生成一个包含leadership所有变量名的字符型向量
myvars <- names(leadership) %in% c('q3', 'q4') # 返回一个逻辑型向量,'q3'和'q4'对应的列逻辑值为TRUE
newdata <- leadership[!myvars] # !将逻辑值取反,'q3'和'q4'对应的列逻辑值为FALSE,最后逻辑值为TRUE的列被leadership选入(保留),即剔除了'q3'和'q4'

# 已知变量下标,利用
newdata <- leadership[c(-8, -9)] # 在leadership中剔除变量下标为8和9的变量

# 已知变量名,利用<- NULL剔除变量
leadership$q3 <- leadership$q4 <- NULL # 在leadership中剔除变量'q3'和'q4'
# 注意:NULL表示未定义,与NA(表示缺失)意义不同

4.10.3选入观测

# 从一个大数据集中选择有限观测来创建一个新的数据集的
# 一:行下标选择观测:
newdata <- leadership[1:3, ] # 选择leadership的前三行

# 二:which()和逻辑值向量组合选择观测:which()函数能给出向量中值为TRUE元素的下标
newdata <- leadership[which(leadership$gender=='M' & leadership$age>30), ]

4.10.4subset()函数

# 使用subset()函数可以更方便地选择变量和观测,下面是两个示例:
newdata <- subset(leadership, age >= 35 | age < 24, select=c(q1, q2, q3, q4)) # 选择大于等于35岁或小于24岁的男性的观测,保留变量q1,q2,q3,q4
newdata <- subset(leadership, gender=='M' & age > 25, select=gender:q4) # 选择25岁以上男性的观测,保留gender到q4之间的所有变量(用到了冒号运算符:)

4.10.5随机抽样

# sample()函数可实现随机抽样:sample()函数返回随机抽样得到的元素作为数据框中的行
mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE),] # sample第一个参数是待抽样行下标组成的向量,第二个参数是抽样数量,第三个参数表示无放回抽样

R中还有其他抽样工具,如抽取和调查样本的sampling包,分析复杂调查数据的survey包等。

4.11使用SQL语句操作数据框

library(sqldf) # 要在R中调用SQL需要依赖sqldf包
newdf <- sqldf('select * from mtcars where carb=1 order by mpg', row.names=TRUE) # row.names=TRUE会将原始数据框中的行名延续到新数据框中
sqldf('select avg(mpg) as avg_mpg, avg(disp) as avg_disp, gear
    from mtcars where cyl in (4, 6) group by gear')

你可能感兴趣的:(R语言,r语言)