当前位置: 首页 > news >正文

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语言基础学习手册

相关文章:

  • 【.net core】SkiaSharp 如何在Linux上实现
  • Axios 如何通过配置实现通过接口请求下载文件
  • docker运行centos提示Operation not permitted
  • 2023-ICLR-ReAct 首次结合Thought和Action提升大模型解决问题的能力
  • CentOS:企业级Linux的社区力量与未来演进
  • aws instance store 的恢复
  • lesson04-简单回归案例实战(理论+代码)
  • AWS WebRTC:获取ICE服务地址(part 2): ICE Agent的作用
  • MySQL JSON数据存储结构与操作
  • 【深度学习】11. Transformer解析: Self-Attention、ELMo、Bert、GPT
  • jenkins集成gitlab实现自动构建
  • Redis--基础知识点--28--慢查询相关
  • 腾讯云国际站性能调优
  • WPF 全局加载界面、多界面实现渐变过渡效果
  • 浅谈JMeter之常见问题Address already in use: connect
  • Hadoop MapReduce:大数据处理利器
  • springboot配置cors拦截器与cors解释
  • 【东枫科技】KrakenSDR 测向快速入门指南
  • CSS 样式表的四种应用方式及css注释的应用小结
  • 板凳-------Mysql cookbook学习 (八--2)
  • 微信网站可以免费做么/广州百度关键词排名
  • 做代理的网站/收录提交入口网址
  • 网站测试方法/搜索引擎优化的例子
  • 南通通州区城乡建设局网站/常用搜索引擎有哪些
  • tp3.2.3网站开发实例/百度手机极速版
  • 域名哪个网站好/在线网站建设平台