R语言基础| 数据基本管理与操作
上次教程我们已经和大家一起完成了创建数据集的学习,在本次内容里我们将进一步对数据进行管理与操作。
示例展示(本节均用它学习)
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))
leadership
## manager date country gender age q1 q2 q3 q4 q5
## 1 1 10/24/08 US M 32 5 4 5 5 5
## 2 2 10/28/08 US F 45 3 5 2 5 5
## 3 3 10/1/08 UK F 25 3 5 5 5 2
## 4 4 10/12/08 UK M 39 3 3 4 NA NA
## 5 5 5/1/09 UK F 99 2 2 1 2 1
3.1 创建新变量请输入标题
3.1.1语法
变量名 <- 表达式
这一过程会涉及到一些算术运算符和函数:
算术运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
^or** | 求幂 |
x%%Y | 求余,例如:5%%2的结果为1 |
x%/%Y | 整数除法。例如:5%/%2的结果为2 |
3.1.2举例
若我们想创建2个新变量分别为total_score(q1-q5之和),和mean_score(q1-q5的均值):
方法一:
leadership$total_score <- leadership$q1+leadership$q2+leadership$q3+leadership$q4+leadership$q5leadership$mean_score <- (leadership$q1+leadership$q2+leadership$q3+leadership$q4+leadership$q5)/5
leadership
## manager date country gender age q1 q2 q3 q4 q5 total_score mean_score
## 1 1 10/24/08 US M 32 5 4 5 5 5 24 4.8
## 2 2 10/28/08 US F 45 3 5 2 5 5 20 4.0
## 3 3 10/1/08 UK F 25 3 5 5 5 2 20 4.0
## 4 4 10/12/08 UK M 39 3 3 4 NA NA NA NA
## 5 5 5/1/09 UK F 99 2 2 1 2 1 8 1.6
方法二:利用transform()函数,能将原始数据中的数据进行转换,转换方式包括按照指定的函数,添加新的变量和删除变量。
leadership <- transform(leadership,total_score=q1+q2+q3+q4+q5,mean_score=(q1+q2+q3+q4+q5)/5)
leadership
## manager date country gender age q1 q2 q3 q4 q5 total_score mean_score
## 1 1 10/24/08 US M 32 5 4 5 5 5 24 4.8
## 2 2 10/28/08 US F 45 3 5 2 5 5 20 4.0
## 3 3 10/1/08 UK F 25 3 5 5 5 2 20 4.0
## 4 4 10/12/08 UK M 39 3 3 4 NA NA NA NA
## 5 5 5/1/09 UK F 99 2 2 1 2 1 8 1.6
3.2 变量的重编码(recoding)
leadership
## manager date country gender age q1 q2 q3 q4 q5 total_score mean_score
## 1 1 10/24/08 US M 32 5 4 5 5 5 24 4.8
## 2 2 10/28/08 US F 45 3 5 2 5 5 20 4.0
## 3 3 10/1/08 UK F 25 3 5 5 5 2 20 4.0
## 4 4 10/12/08 UK M 39 3 3 4 NA NA NA NA
## 5 5 5/1/09 UK F 99 2 2 1 2 1 8 1.6
## agecat
## 1 Young
## 2 Young
## 3 Young
## 4 Young
## 5 Elder
2)写法2,利用within()函数,它与with()函数类似,不同的是within()允许修改数据框
leadership <- within(leadership,{agecat <- NA agecat[age>75] <- "Elder"agecat[age>=55&age<=75] <- "Middle"agecat[age<55] <- "Young"})
leadership
## manager date country gender age q1 q2 q3 q4 q5 total_score mean_score
## 1 1 10/24/08 US M 32 5 4 5 5 5 24 4.8
## 2 2 10/28/08 US F 45 3 5 2 5 5 20 4.0
## 3 3 10/1/08 UK F 25 3 5 5 5 2 20 4.0
## 4 4 10/12/08 UK M 39 3 3 4 NA NA NA NA
## 5 5 5/1/09 UK F 99 2 2 1 2 1 8 1.6
## agecat
## 1 Young
## 2 Young
## 3 Young
## 4 Young
## 5 Elder
3.3 变量的重命名
3.3.1 方法一:fix(数据框)
例如
fix(leadership)
则出现一个交互式编辑器,单击变量名则可对其重命名
3.3.2 方法二:name()函数
语法
names(leadership)
## [1] "manager" "date" "country" "gender" "age"
## [6] "q1" "q2" "q3" "q4" "q5"
## [11] "total_score" "mean_score" "agecat"
names(leadership)[2] <- "testDate"
leadership
## manager testDate country gender age q1 q2 q3 q4 q5 total_score mean_score
## 1 1 10/24/08 US M 32 5 4 5 5 5 24 4.8
## 2 2 10/28/08 US F 45 3 5 2 5 5 20 4.0
## 3 3 10/1/08 UK F 25 3 5 5 5 2 20 4.0
## 4 4 10/12/08 UK M 39 3 3 4 NA NA NA NA
## 5 5 5/1/09 UK F 99 2 2 1 2 1 8 1.6
## agecat
## 1 Young
## 2 Young
## 3 Young
## 4 Young
## 5 Elder
names(leadership)[6:10] <- c("item1","item2","item3","item4","item5")
leadership
## manager testDate country gender age item1 item2 item3 item4 item5 total_score
## 1 1 10/24/08 US M 32 5 4 5 5 5 24
## 2 2 10/28/08 US F 45 3 5 2 5 5 20
## 3 3 10/1/08 UK F 25 3 5 5 5 2 20
## 4 4 10/12/08 UK M 39 3 3 4 NA NA NA
## 5 5 5/1/09 UK F 99 2 2 1 2 1 8
## mean_score agecat
## 1 4.8 Young
## 2 4.0 Young
## 3 4.0 Young
## 4 NA Young
## 5 1.6 Elder
3.4 缺失值(NA)
3.4.1 检测数据中是否含有缺失值
x为向量、数据框等名字,返回结果为FALSE=非NA,TRUE=NA,返回位置与元素或数值位置对应
is.na(x)
例如:
is.na(leadership[,6:10])
## item1 item2 item3 item4 item5
## [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
缺失值NA不可标记,无法使用比较运算符来检测其是否存在。
在R中无限的或不可能的值均不认为是缺失值,分别用is.infinite()和is.nan()来检测是否是无限的或不可能值(不是一个数)。
3.4.2 重编码某些值为NA
在数据分析前,有的观测值差异较大或者一看就是错的,则可以设置为NA 例如:
leadership$age[leadership$age==99] <- NA
3.4.3 剔除NA
由于在数据分析时,若数据集中含有NA,则算术表达式和函数计算出来的也是NA,因此数据分析前应进行剔除。
-
3.4.3.1 仅剔除NA值
语法:
na.rm=TRUE
举例:
x <- c(1,2,NA,3)
y <- sum(x)
z <- mean(x)
y1 <- sum(x,na.rm = TRUE)
z1 <- mean(x,na.rm=TRUE)
y
## [1] NA
y1
## [1] 6
z
## [1] NA
z1
## [1] 2
na.rm=TRUE
注意:使用不同的函数,如这里的sum(),应用帮助命令如help(“sum”)检查这些函数如何去除NA
-
3.4.3.2剔除NA值所在的行(行删除)
语法:x为数据集的名字
na.omit(x)
例如:
leadership
## manager testDate country gender age item1 item2 item3 item4 item5 total_score
## 1 1 10/24/08 US M 32 5 4 5 5 5 24
## 2 2 10/28/08 US F 45 3 5 2 5 5 20
## 3 3 10/1/08 UK F 25 3 5 5 5 2 20
## 4 4 10/12/08 UK M 39 3 3 4 NA NA NA
## 5 5 5/1/09 UK F NA 2 2 1 2 1 8
## mean_score agecat
## 1 4.8 Young
## 2 4.0 Young
## 3 4.0 Young
## 4 NA Young
## 5 1.6 Elder
newdata <- na.omit(leadership)
newdata
## manager testDate country gender age item1 item2 item3 item4 item5 total_score
## 1 1 10/24/08 US M 32 5 4 5 5 5 24
## 2 2 10/28/08 US F 45 3 5 2 5 5 20
## 3 3 10/1/08 UK F 25 3 5 5 5 2 20
## mean_score agecat
## 1 4.8 Young
## 2 4.0 Young
## 3 4.0 Young
3.5 日期值
3.5.1 定义
日期值一般以字符串形式输入到R中,然后转换为以数值型存储的日期变量,可以用as.Date()执行该转换。语法(x为字符型数据,input_format则为用于读入日期的适当格式):
as.Date(x,"input_format")
日期格式有:
符号 | 含义 | 示例 |
---|---|---|
%d | 数字表示的日期(0-31) | 0-31 |
%a | 缩写的星期名 | Mon |
%A | 非缩写的星期名 | Monday |
%m | 月份(0-12) | 00-12 |
%b | 缩写的月份 | Jan |
%B | 非缩写的月份 | January |
%y | 两位数年份 | 07 |
%Y | 四位数年份 | 2007 |
举例:默认的输入格式为yyy-mm-dd,若输入的格式不是这种,则需要注明;
在leadership中日期是mm/dd/yy格式编码的字符型变量,因此:
myformat <- "%m/%d/%Y"
leadership$testDate <- as.Date(leadership$testDate,myformat)
在完成这一转换后就变成了数值型数据,可以对其进行分析和绘图。
两个实用函数:Sys.Date()返回当天的日期和date()返回当前的时间和日期
Sys.Date()
## [1] "2023-11-21"
date()
## [1] "Tue Nov 21 17:18:43 2023"
format(x,format=“output_format”)可以输出指定格式的日期
mydate <- Sys.Date()
format(mydate,format="%B %d %Y")
## [1] "十一月 21 2023"
3.5.2 用于计算
1)直接用算术运算符
startdate <- as.Date("2020-09-21")
enddate <- as.Date("2023-01-19")
days <- enddate-startdate
days
## Time difference of 850 days
2)使用difftime()函数
startdate <- as.Date("2020-09-21")
enddate <- as.Date("2023-01-19")
difftime(enddate,startdate,units = "days")
## Time difference of 850 days
3.6 类型判断和转换
判断 | 转换 | 类型 |
---|---|---|
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.7 数据排序
order()函数进行,默认升序,在变量前加一减号则为降序,也可以按多个条件排序
newdata <- leadership[order(leadership$age),]
newdata1 <- leadership[order(leadership$gender,leadership$age),]
newdata2 <- leadership[order(leadership$gender,-leadership$age),]
newdata
## manager testDate country gender age item1 item2 item3 item4 item5
## 3 3 0008-10-01 UK F 25 3 5 5 5 2
## 1 1 0008-10-24 US M 32 5 4 5 5 5
## 4 4 0008-10-12 UK M 39 3 3 4 NA NA
## 2 2 0008-10-28 US F 45 3 5 2 5 5
## 5 5 0009-05-01 UK F NA 2 2 1 2 1
## total_score mean_score agecat
## 3 20 4.0 Young
## 1 24 4.8 Young
## 4 NA NA Young
## 2 20 4.0 Young
## 5 8 1.6 Elder
newdata1
## manager testDate country gender age item1 item2 item3 item4 item5
## 3 3 0008-10-01 UK F 25 3 5 5 5 2
## 2 2 0008-10-28 US F 45 3 5 2 5 5
## 5 5 0009-05-01 UK F NA 2 2 1 2 1
## 1 1 0008-10-24 US M 32 5 4 5 5 5
## 4 4 0008-10-12 UK M 39 3 3 4 NA NA
## total_score mean_score agecat
## 3 20 4.0 Young
## 2 20 4.0 Young
## 5 8 1.6 Elder
## 1 24 4.8 Young
## 4 NA NA Young
newdata2
## manager testDate country gender age item1 item2 item3 item4 item5
## 2 2 0008-10-28 US F 45 3 5 2 5 5
## 3 3 0008-10-01 UK F 25 3 5 5 5 2
## 5 5 0009-05-01 UK F NA 2 2 1 2 1
## 4 4 0008-10-12 UK M 39 3 3 4 NA NA
## 1 1 0008-10-24 US M 32 5 4 5 5 5
## total_score mean_score agecat
## 2 20 4.0 Young
## 3 20 4.0 Young
## 5 8 1.6 Elder
## 4 NA NA Young
## 1 24 4.8 Young
注意注意,方括号里面有一个逗号不能少!!这表示其他列会随之而动
3.8 数据集的合并
3.8.1 直接横向合并,合并变量(要求行数相同)
语法(A,B是数据集的名字):
total <- cbind(A,B)
3.8.2 直接纵向合并,合并观测值(要求变量数量和排序相同)
语法(A,B是数据集的名字):
total <- rbind(A,B)
3.8.3 内联结横向合并(最常见的就是根据ID一一对应着合并)
语法:
total <- merge(dataframeA,dataframeB,by="ID")
total <- merge(dataframeA,dataframeB,by=c("ID","country"))
一般用于在数据框中添加变量。
3.9 选取变量
3.9.1 dataframe[,column indices]
只设置列下标,不设置行下标例如:
newdata <- leadership[,c(6:10)]
newdata
## item1 item2 item3 item4 item5
## 1 5 4 5 5 5
## 2 3 5 2 5 5
## 3 3 5 5 5 2
## 4 3 3 4 NA NA
## 5 2 2 1 2 1
3.9.2 直接手动选择变量名
比较适用于变量特别多,不清楚具体是第几列的:
vars <- c("item1","item2","item3","item4")
newdata <- leadership[,vars]
newdata
## item1 item2 item3 item4
## 1 5 4 5 5
## 2 3 5 2 5
## 3 3 5 5 5
## 4 3 3 4 NA
## 5 2 2 1 2
3.10 选取观测值
3.10.1 dataframe[row indices,]
只设置行下标,不设置列下标例如:
newdata <- leadership[1:3,]
newdata
## manager testDate country gender age item1 item2 item3 item4 item5
## 1 1 0008-10-24 US M 32 5 4 5 5 5
## 2 2 0008-10-28 US F 45 3 5 2 5 5
## 3 3 0008-10-01 UK F 25 3 5 5 5 2
## total_score mean_score agecat
## 1 24 4.8 Young
## 2 20 4.0 Young
## 3 20 4.0 Young
3.10.2 手动设置条件观测值
newdata <- leadership[leadership$gender=="M"&leadership$age>30,]
newdata
## manager testDate country gender age item1 item2 item3 item4 item5
## 1 1 0008-10-24 US M 32 5 4 5 5 5
## 4 4 0008-10-12 UK M 39 3 3 4 NA NA
## total_score mean_score agecat
## 1 24 4.8 Young
## 4 NA NA Young
3.11 subset()函数选择观测值或变量
该方法非常简便:
newdata <- subset(leadership,age>=35|age<23,select=c(item1,item2,item3,item4))
newdata
## item1 item2 item3 item4
## 2 3 5 2 5
## 4 3 3 4 NA
代码含义:选择年龄在35以上或(|)23岁以下的所有观测值(对观测值选取), 并保留变量item1,item2,item3,item4.
select=则是对变量的选取。
3.12 剔除变量
3.12.1 方法一
myvars <- names(leadership)%in%c("item1","item2")
newdata <- leadership[!myvars]
newdata
## manager testDate country gender age item3 item4 item5 total_score
## 1 1 0008-10-24 US M 32 5 5 5 24
## 2 2 0008-10-28 US F 45 2 5 5 20
## 3 3 0008-10-01 UK F 25 5 5 2 20
## 4 4 0008-10-12 UK M 39 4 NA NA NA
## 5 5 0009-05-01 UK F NA 1 2 1 8
## mean_score agecat
## 1 4.8 Young
## 2 4.0 Young
## 3 4.0 Young
## 4 NA Young
## 5 1.6 Elder
3.12.2 方法二
先用names()函数将数据集的变量展示出来,知道需要删除变量对应的位置(序号),在需要剔除变量序号前加一个减号即可。
names(leadership)
## [1] "manager" "testDate" "country" "gender" "age"
## [6] "item1" "item2" "item3" "item4" "item5"
## [11] "total_score" "mean_score" "agecat"
newdata <- leadership[c(-2,-3)]
newdata
## manager gender age item1 item2 item3 item4 item5 total_score mean_score
## 1 1 M 32 5 4 5 5 5 24 4.8
## 2 2 F 45 3 5 2 5 5 20 4.0
## 3 3 F 25 3 5 5 5 2 20 4.0
## 4 4 M 39 3 3 4 NA NA NA NA
## 5 5 F NA 2 2 1 2 1 8 1.6
## agecat
## 1 Young
## 2 Young
## 3 Young
## 4 Young
## 5 Elder
3.13 dplyr包
3.13.1 安装并加载
install.packages("dplyr")
library(dplyr)
##
## 载入程辑包:'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
用于操作数据框的dplyr函数
函数 | 用途 |
---|---|
select() | 选择变量/列 |
filter() | 选择观测值/行 |
mutate() | 转换或重编码变量,添加变量 |
rename() | 重命名变量/列 |
recode() | 重编码变量值 |
arrange() | 按变量值对行进行排序(升序) |
desc() | 按变量值对行进行排序(倒序) |
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))
leadership
## manager date country gender age q1 q2 q3 q4 q5
## 1 1 10/24/08 US M 32 5 4 5 5 5
## 2 2 10/28/08 US F 45 3 5 2 5 5
## 3 3 10/1/08 UK F 25 3 5 5 5 2
## 4 4 10/12/08 UK M 39 3 3 4 NA NA
## 5 5 5/1/09 UK F 99 2 2 1 2 1
library(dplyr)
leadership <- mutate(leadership,total_score=q1+q2+q3+q4+q5,mean_score=total_score/5)
leadership$gender <- recode(leadership$gender,"M"="male","F"="female")
leadership <- rename(leadership,ID="manager",sex="gender")
leadership <- arrange(leadership,sex,mean_score)
leadership_rating <- select(leadership,ID,mean_score)
leadership_men_high <- filter(leadership,sex=="male"&total_score>10)
leadership
## ID date country sex age q1 q2 q3 q4 q5 total_score mean_score
## 1 5 5/1/09 UK female 99 2 2 1 2 1 8 1.6
## 2 2 10/28/08 US female 45 3 5 2 5 5 20 4.0
## 3 3 10/1/08 UK female 25 3 5 5 5 2 20 4.0
## 4 1 10/24/08 US male 32 5 4 5 5 5 24 4.8
## 5 4 10/12/08 UK male 39 3 3 4 NA NA NA NA
vector <- recode(vector,oldvalue1=newvalue1,oldvalue2=newvalue2,...)
dataframe <- rename(dataframe,newname1="oldname1",newname2="oldname2",...)
dataframe_subset <- select(dataframe,variablelist1variablelist2,...)
dataframe <- arrange(dataframe,variblelist1,variblelist2,...)
dataframe <- desc(dataframe,variblelist1,variblelist2,...)
dataframe <- filter(dataframe,expression)
注:
recode:对于数值型,用反引号``来引用原始值,字符型用”“,未指定新值的向量值保持不变
rename:新名字在前,旧名字在后
select:选取变量,可以用:来选取一系列的变量,在变量前加一个减号(-)则剔除该变量
arrange:默认升序排序
desc:倒序排序
3.14 使用管道操作符对语句进行串接
使用magrittr包提供的管道运算符%>%
data <- filter(leadership,total_score>10)
data <- select(ID,country,mean_score)
data <- arrange(country,mean_score)
这3条语句可以用%>%重新写为一条语句:
data <- filter(leadership,total_score>10)%>%select(ID,country,mean_score)%>%arrange(country,mean_score)
完整教程请查看
R语言基础学习手册