第3章 基本数据管理
3.1 一个示例
使用代码创建一个名为leadership的数据框存储上述表格
leadership <- data.frame(
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)
)
3.2 创建新变量
公式:
变量名 <- 表达式 (“表达式”部分可以包含多种运算符和函数)
现有leadership数据框,想创建新变量total_score和mean_score:
方法一:
leadership$total_score <- leadership$q1 + leadership$q2 + leadership$q3 + leadership$q4 + leadership$q5
leadership$mean_score <- (leadership$q1 + leadership$q2 + leadership$q3 + leadership$q4 + leadership$q5)/5
方法二:推荐
leadership <- transform(leadership,
total_score = q1+ q2 + q3 + q4 + q5,
mean_score = ( q1+ q2 + q3 + q4 + q5)/5)
3.3 变量的重编码
重编码涉及根据同一变量和或其他变量的现有值创建新值的过程。举例来说,你可能想:
- 将一个连续型变量修改为一组类别值;
- 将误编码的值替换为正确值;
- 基于一组分数线创建一个表示及格/不及格的变量。
要重编码数据,可以使用R中的一个或多个逻辑运算符(见表)。
将leadership数据集中经理人的连续型年龄变量age重编码为类别型变量agecat(Young、 Middle Aged、Elder)。首先,必须将99岁的年龄值重编码为缺失值(因为不可能有人99岁了还当经理,我们默认99是缺失值),使用的代码为:
leadership$age[leadership$age == 99] <- NA
#然后用以下代码创建新变量agecat为age的类别型变量
leadership$agecat[leadership$age > 75] <- "Elder"
leadership$agecat[leadership$age >= 55 & leadership$age <= 75] <- "Middle Aged"
leadership$agecat[leadership$age < 55 ] <- "Young"
#这个代码看起来很臃肿,可以用函数within()它和with()
leadership <- within(leadership,{
agecat <- NA
agecat[age>75] <- 'Elder'
agecat[age>=55 & age<=75] <- 'Middle Aged'
agecat[age<55] <- 'Young' })
#此时agecat只是字符型变量,我们需要转换成有序型因子:
leadership$agecat <- factor(leadership$agecat,
levels = c('Young','Middle Aged','Elder'),
ordered = TRUE)
3.4 变量的重命名
方法一:使用语句调用交互式编辑器
fix(leadership)
方法二:names函数
names(leadership)[2] <- "testDate"
names(leadership)[6:10] <- c("item1","item2","item3","item4","item5")
3.5 缺失值
在R中,缺失值以符号NA表示。
检测缺失值是否存在。
is.na(leadership[,6:10]) # 取数据框的6~10列
## q1 q2 q3 q4 q5
## [1,] FALSE FALSE FALSE FALSE FALSE
## [2,] FALSE FALSE FALSE FALSE FALSE
## [3,] FALSE FALSE FALSE FALSE FALSE
## [4,] FALSE FALSE FALSE TRUE TRUE
## [5,] FALSE FALSE FALSE FALSE FALSE
# []中加',' 前是行,后是列
is.na(leadership[1,6:10]) #取数据框第1行的6~10列
## q1 q2 q3 q4 q5
## [1,] FALSE FALSE FALSE FALSE FALSE
注意:
- 缺失值被认为是不可比较的。
- R并不会把无限的或者不可能出现的标记为缺失值。正无穷和负无穷分别为Inf和-Inf,不可能的值用NaN表示。识别分别用is.infinite()或is.nan()
3.5.1 重编码某些值为缺失值
leadership$age[leadership$age == 99] <- NA
3.5.2 在分析中排除缺失值
含有缺失值的算术表达式和函数计算结果也是缺失值,因此需要数据分析前删除缺失值。
多数的数值函数都有 选项,可以在计算前移除缺失值并使用剩余值计算。
x = c(1,2,NA,4)
sum(x, na.rm = TRUE)
使用函数处理不完整的数据时,查下帮助文档,看看这些函数时如何处理缺失数据的。
可删除所有含有缺失值数据的行。
newdata <- na.omit(leadership)
## ManageID testData country gender age q1 q2 q3 q4 q5 agecut
## managerID testDate country gender age item1 item2 item3 item4 item5 total_score mean_score age
## 1 1 10/24/08 US M 32 5 4 5 5 5 24 4.8 32
## 2 2 10/28/08 US F 45 3 5 2 5 5 20 4.0 45
## 3 3 10/1/08 UK F 25 3 5 5 5 2 20 4.0 25
3.6 日期值
日期值通常以字符串的形式输入到R中,然后转化为以数值形式存储的日期变量。输出默认格式:yyyy-mm-dd 语法:
符号 | 含义 | 示例 |
---|---|---|
%d | 数字表示的日期(0~31) | 01~31 |
%a | 缩写的星期名 | Mon |
%A | 非缩写星期名 | Monday |
%m | 月份(00~12) | 00~12 |
%b | 缩写的月份 | Jan |
%B | 非缩写月份 | January |
%y | 两位数的年份 | 07 |
%Y | 四位数的年份 | 2007 |
mydates <- as.Date(c("2007-06-22","2004-02-13")) --日期值默认输入格式为‘yyyy-mm-dd’
strDates <- c("01/05/1965","08/16/1975")
dates <- as.Date(strDates, "%m/%d/%Y") --使用mm/dd/yyyy格式读取
myformat <- "%m/%d/%y" --leadership数据框中,日期以mm/dd/yy格式编码为字符型变量
leadership$date <- as.Date(leadership$date, myformat)
Sys.Date() 返回当前日期
[1] "2024-09-02"
Sys.time() 返回当前日期+时间
[1] "2024-09-02 20:37:16 CST"
date() 返回当前日期+时间
[1] "Mon Sep 2 20:37:24 2024"
输出指定格式的日期值或提取日期值的某些部分
today = Sys.Date()
format(today, format = "%d/%m/%y")
## "02/09/24"
format(today, format = "%A")
## "星期二"
日期值可以执行算数运算,diiftime()可以计算时间间隔,并以星期、天、时、分、秒表示
today = Sys.Date()
my_birth <- as.Date("1990-01-11")
days <- today - my_birth
days
输出:Time difference of 12653 days
difftime(today, my_birth, units = "weeks")
输出:Time difference of 1807.571 weeks
可将日期值转换为字符型
as.character(my_birth)
[1] "1990-01-11"
3.7 类型转换
判断 | 转换 |
---|---|
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() |
3.8 数据排序
默认升序,在排序变量的前边加一个减号即可得到降序的排序结果。
答:加逗号,按行排序,不加逗号,默认按列排序。
规则:将隔行按女性到男性、同样性别中按年龄升序排序
newdata <- leadership[order(leadership$gender,leadership$age),]
规则:将隔行按女性到男性、同样性别中按年龄降序排序
newdata <- leadership[order(leadership$gender, -leadership$age),]
3.9 数据集的合并
在数据框中添加列,横向合并通过一个或多个共有变量联结:
total = merge(dataframeA, dataframeB, by = "ID")
total = merge(dataframeA, dataframeB, by = c("ID","Country"))
横向合并,保证其正常工作需:每个对象必须拥有相同的行数、以同顺序排序。
纵向合并,两个数据框必须有相同变量,不过顺序不一定相同.
total = rbind(dataframeA, dataframeB)
3.10 切分数据集
选取变量
newdata=newdata2保留q1-q5列
myvars <- paste("q",1:5)
newdata <- leadership[myvars]
newdata2 <- leadership[,myvars]
剔除变量
方法一:
myvar <- names(leadership) %in% c("q1","q2")
newdata <- leadership[!myvar]
newdata
方法二:只要要删哪一行,直接给出来即可
newdata <- leadership[c(-6,-7)]
方法三:知道要删哪个变量,直接赋值NULL,注意:NULL与NA不同。
leadership$q1 <- leadership$q2 <- NULL
选入观测值
举例:选出30岁以上的男性
select1 <- leadership[leadership$gender == 'M' & leadership$age > 30,]
研究范围限定在在2009年1月1日到2009年12月31日之间收集的观测上
leadership$date <- as.Date(leadership$date,"%m/%d/%y")
min <- as.Date("2009-01-01")
max <- as.Date("2009-12-31")
newdata <- leadership[which(leadership$date >= min & leadership$date < = max),]
subset()函数
非常简单的选择变量和观测的方法
newdata <- subset(leadership, age>=35 | age<23, select = c(q1,q2,q3,q4))
选择年龄在35以上或23以下的所有观测值,并保留变量q1到q4
newdata <- subset(leadership, gender == "M" & age >25, select = gender:q4)
选择年龄在25以上的男性,并保留变量gender到q4
随机抽样
从leadership数据库中随机抽取大小为3的样本
在数据挖掘和机器学习中常用。如你可能希望选择两份随机样本,一份用于构建预测模型,另一份用于验证模型的有效性。
mysample<- leadership[sample(1:nrow(leadership), 3, replace = FALSE),]