基本数据管理
碎碎念
该部分还是基于书《R语言实战》,加上自己的一些实践和实验,希望自己可以努力,早日毕业!!
前提示例
研究问题:处于管理岗位的男女性在听从上级的程度上是否存在不同?这种情况是否依国家的不同而不同?
研究数据:让多个国家的经理人的上司对其服从程度打分,询问5个问题,针对这5个问题(q1-q5)进行打分,1-5分,数据如下
base4.csv
manager,date,country,gender,age,q1,q2,q3,q4,q5
1,2010/24/8,US,M,32,5,4,5,5,5
2,2010/28/8,US,F,45,3,5,2,5,5
3,2010/1/8,UK,F,25,3,5,5,5,2
4,2010/12/8,UK,M,39,3,3,4,
5,2005/1/9,UK,F,99,2,2,1,2,1
需要解决的问题:
- 每位经理人需要生成一个评分
- 缺失值的处理
- 选择感兴趣的变量分析
- 验证领导行为是否随着经理人的年龄发生变化
- 选择特定时间范围内的数据进行分析
基础操作
1、运算符
(1)算数运算
运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
^ or ** | 求幂 |
x%%y | 求余数,7%%2 = 1 |
x%/%y | 求整数除法,7%%2 = 3 |
(2)逻辑运算
运算符 | 描述 |
---|---|
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
== | 严格求等,注意对浮点数进行运算可能会出错 |
!= | 不等于 |
!x | 非x |
x | y | x或y |
x & y | x和y |
isTRUE(x) | x是否是TRUE |
(3)数据类型转化
2、缺省值
注意区分以下几个符号:
符号 | 含义 | 检验的函数 |
---|---|---|
NA | Not Available,不可用,可以理解为不存在、缺省。 | is.na() |
inf | 无穷,正无穷inf,负无穷-inf。 | is.infinite() |
NaN | not a number,不是一个数,表示不可能的值,例如sin(inf)。 | is.nan() |
关于缺省值需要注意:
(1)缺省值不可以比较,即使是和自己也不行,也就是说不能使用比较运算符来判断其是否存在。
(2)含有缺省值的算术表达式和函数计算结果也是缺省值。部分函数有na.rm参数,可以在计算之前移除缺省值,用剩余的数据进行计算。因此在处理含有缺省值的数据时,建议使用help()查询所用函数如何处理缺省值的。
x <- c(1,2,NA,3)
sum(x)
<返回值> NA
sum(x, na.rm=TRUE)
<返回值> 6
(3)可以通过na.omit()移除所有含有缺省值的行,即观测样本。
如何处理缺省值,还有更多的方法可以学习。(链接后续等学到再补)
3、日期
日期往往是以字符串的形式输入的,可以用as.Date()将其转化为以数值形式储存的日期变量。其基本语法为:
as.Date(x, "input_format")
# 以示例中的为例,存储的模式是四位数年份/日期/数字的月份
dataformat <- "%Y/%d/%m"
leadership$date <- as.Date(leadership$date, dataformat)
结果为:
input_format是一组字符串,给出x中日期的储存格式。
符号 | 含义 |
---|---|
%d | 日期,数字,1~31 |
%a | 星期,缩写,例如 Mon |
%A | 星期,全称,例如 Monday |
%m | 月份,数字,01~12 |
%b | 月份,缩写,例如 Jan |
%B | 月份,全称,例如 January |
%y | 年份,两位数,例如 22 |
%Y | 年份,四位数,例如 2022 |
其他的基础函数:
Sys.Date() # 返回当天的日期
<返回值> "2022-11-16"
date() # 返回当前的日期和时间
<返回值> "Wed Nov 16 11:25:41 2022"
testdate <- as.Date("1999-11-28")
now <- Sys.Date()
difftime(now, testdate, units="weeks") # 计算日期间隔
<返回值> Time difference of 1198.429 weeks
difftime(now, testdate, units="days")
<返回值> Time difference of 8389 days
一些示例
示例一:求数据的和与均值并储存在数据框内
mydata <- data.frame(x1=c(2,2,4,6),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)
示例二:将一开始的示例中的年龄进行补充,并以55岁和75岁为界限分为Young,Middle Aged,Elder。
# 方法一
leadership$age[leadership$age==99] <- NA # 修改原有变量
leadership$agecat[leadership$age > 75] <- "Elder" # 创建新变量并赋值
# 方法二,使用within(),与with()不同的是它允许修改数据框内的数据
leadership <- within(leadership, {
age[age==99] <- NA # 排查缺省值
agecat <- NA # 创建一个新的agecat变量并初始化为缺省值
agecat[age > 75] <- "Elder"
agecat[age >= 55 & age <= 75] <- "Middle Aged"
agecat[age < 55] <- "Young"
})
结果为:
示例三:将date重命名为testDate
# 方法一:使用names()
names(leadership)
names(leadership)[2] <- "testDate"
names(leadership)
<返回值>
[1] "manager" "date" "country" "gender" "age" "q1" "q2" "q3" "q4" "q5"
[11] "agecat"
<返回值>
[1] "manager" "testDate" "country" "gender" "age" "q1" "q2" "q3" "q4"
[10] "q5" "agecat"
# 方法二:使用plyr,注意该函数需要先安装,install.packages("plyr")
library(plyr)
leadership <- rename(leadership, c(manager="ID", date="testDate"))
示例四:排序
# 方法一:order(), 返回值为索引
order(..., # vectors,排序的数据,
na.last = TRUE, # 缺省值的位置,默认是在最后
decreasing = FALSE, # 升序(FALSE) or 降序(TRUE)
method = c("auto", "shell", "radix")
)
order(leadership$age)
<返回值> 3 1 4 2 5
test <- c("I","am","looking","forward","to","the","weekend")
test[order(test)]
<返回值> "am" "forward" "I" "looking" "the" "to" "weekend"
# 方法二:sort(),返回值为排序后的结果
sort(x, decreasing = FALSE,
na.last = NA # TRUE:将缺省值放在最后,FALSE:将缺省值放在开始,NA:删除缺省值)
sort(leadership$age)
<返回值> 25 32 39 45
sort(leadership$age, na.last = TRUE)
<返回值> 25 32 39 45 NA
示例五:合并,添加
数据如下:
dataA1 = data.frame(ID=c(1,2,3),
country=c("US","US","UK"),
gender=c("M","F","F"),
age=c(32,45,25))
dataA2 = data.frame(ID=c(4,5),
country=c("UK","US"),
gender=c("M","F"),
age=c(39,NA))
dataB1 = data.frame(ID=c(1,2,3),
q1=c(5,3,3),
q2=c(4,5,5))
dataB2 = data.frame(ID=c(4,5),
q1=c(3,2),
q2=c(3,2))
# 直接合并矩阵或数据框,不指定公共索引
cbind(dataA1,dataB1) # 横向合并,要求行数相同
<返回值>
ID country gender age ID q1 q2
1 1 US M 32 1 5 4
2 2 US F 45 2 3 5
3 3 UK F 25 3 3 5
rbind(dataA1,dataA2) # 纵向合并,要求列数相同
<返回值>
ID country gender age
1 1 US M 32
2 2 US F 45
3 3 UK F 25
4 4 UK M 39
5 5 US F NA
rbind(dataA1,dataB2)
<返回警告> Error in rbind(deparse.level, ...) : 变量的列数不对
# 指定公共索引
merge(dataA1,dataB1, by="ID") # 指定多个索引 by=c("ID", "country")
<返回值>
ID country gender age q1 q2
1 1 US M 32 5 4
2 2 US F 45 3 5
3 3 UK F 25 3 5
示例六:删除
- 删除某些行或者某些列:
# 方法一:用 -索引 删除
leadership[c(-1,-2),] # 删除1、2行,也就是观测值,注意这里的逗号!
<返回值>
manager date country gender age q1 q2 q3 q4 q5 agecat
3 3 2010-08-01 UK F 25 3 5 5 5 2 Young
4 4 2010-08-12 UK M 39 3 3 4 NA NA Young
5 5 2005-09-01 UK F NA 2 2 1 2 1 <NA>
leadership[c(-1,-2)] # 删除1、2列,也就是变量
<返回值>
country gender age q1 q2 q3 q4 q5 agecat
1 US M 32 5 4 5 5 5 Young
2 US F 45 3 5 2 5 5 Young
3 UK F 25 3 5 5 5 2 Young
4 UK M 39 3 3 4 NA NA Young
5 UK F NA 2 2 1 2 1 <NA>
# 方法二:用命名删除
myvars <- names(leadership) %in% c("q3","q4") # 对比列名中q3,q4所在的位置,返回是布尔值向量
leadership[! myvars] # 取反,索引
<返回值>
manager date country gender age q1 q2 q5 agecat
1 1 2010-08-24 US M 32 5 4 5 Young
2 2 2010-08-28 US F 45 3 5 5 Young
3 3 2010-08-01 UK F 25 3 5 2 Young
4 4 2010-08-12 UK M 39 3 3 NA Young
5 5 2005-09-01 UK F NA 2 2 1 <NA>
mysimp <- row.names(leadership) %in% c("1","3")
leadership[! mysimp,] # 同样注意这个逗号!
<返回值>
manager date country gender age q1 q2 q3 q4 q5 agecat
2 2 2010-08-28 US F 45 3 5 2 5 5 Young
4 4 2010-08-12 UK M 39 3 3 4 NA NA Young
5 5 2005-09-01 UK F NA 2 2 1 2 1 <NA>
# 也可以通过确定命名所在的位置索引,利用索引的方法删除元素
# 查找索引的方法有:
which(c("a","v","cc","c","b") %in% "c")
<返回值> 4
grep("c", c("a","v","cc","c","b")) # 该元素只要出现就会识别到
<返回值> 3 4
- 删除某些元素:
# 按照索引删除元素
leadership[! mysimp, ! myvars]
leadership[-c(1,3), -c(8,9)]
<返回值>
manager date country gender age q1 q2 q5 agecat
2 2 2010-08-28 US F 45 3 5 5 Young
4 4 2010-08-12 UK M 39 3 3 NA Young
5 5 2005-09-01 UK F NA 2 2 1 <NA>
# 操作具体的值来删除元素
subset(x,
subset, # 逻辑判别式,填写需要保留的项目
select, # 需要保留的区域,主要是变量区域
drop = FALSE)
# 删除q3q4
subset(leadership, select=-c(8,9))
# 删除年龄在25-30岁之间的样本 -> 保留年龄大于30岁或者小于25岁的样本
subset(leadership, age >= 30 | age < 25)
<返回值>
manager date country gender age q1 q2 q3 q4 q5 agecat
1 1 2010-08-24 US M 32 5 4 5 5 5 Young
2 2 2010-08-28 US F 45 3 5 2 5 5 Young
4 4 2010-08-12 UK M 39 3 3 4 NA NA Young
# 删除年龄在25-30岁之间的样本,并只要他们的评分部分
subset(leadership, age >= 30 | age < 25, select=q1:q5)
<返回值>
q1 q2 q3 q4 q5
1 5 4 5 5 5
2 3 5 2 5 5
4 3 3 4 NA NA