R语言基础| 高级数据管理

写在前面

在R语言中,高级数据管理可利用R的各种功能和包来高效地处理、分析和操作数据集。这包括数据清洗、数值运算、转换、汇总和合并等一系列复杂的数据操作。这里我们简单的演示几种例子。

5.1 函数

5.1.1 数学函数

5.1.1.1 数学函数列表
5.1.1.2 举例
复制代码
x <- sqrt(c(16,25,9))
x

## [1] 4 5 3

5.1.2 统计函数

5.1.2.1 函数列表
5.1.2.2 数据的标准化

这个功能在作图的时候常用,尤其是热图,

1)默认情况下就是对矩阵或数据框进行均值为0,标准化为1的标准化:

复制代码
newdata <- scale(mydata)

2)手动设置任意均值和标准差的标准化,

复制代码
newdata <- scale(mydata)*SD+M

M为想要的均值,SD为想要的标准差

3)指定列而不是整个矩阵或数据框进行标准化

复制代码
newdata <- transform(mydata,myvar=scale(myvar)*10+50)

transform() 函数是一个在R语言中用于对数据框进行转换操作的函数。它可以用来创建新的变量、修改现有变量或进行其他数据的操作和计算。

myvar是mydata数据框中的某一列。

5.1.3 字符处理函数

5.1.3.1 函数列表

5.1.4 其他实用函数

5.1.4.1 函数列表
5.1.4.2 举例
复制代码
name <- "Bob"
cat("hello",name,"\b.\n","Is it R", "\t","great?")

## hello Bob .
##  Is it R      great?

5.1.5 将函数应用于矩阵和数据框

复制代码
c <- matrix(runif(12),nrow = 3)
c

##           [,1]      [,2]      [,3]       [,4]
## [1,] 0.2084683 0.2244816 0.9155885 0.04111768
## [2,] 0.7812188 0.8254042 0.5904615 0.39935037
## [3,] 0.7983854 0.3612492 0.7266544 0.48809138

mean(c)

## [1] 0.5300393

runif(n) 在0-1间生成n个随机数

这里mean(c)求的是12个随机数的总均值,可以通过函数**apply(x,margin,FUN)**来求行或列的函数

复制代码
c <- matrix(runif(12),nrow = 3)
c

##           [,1]      [,2]      [,3]      [,4]
## [1,] 0.6815910 0.1118019 0.2792424 0.3595067
## [2,] 0.8619058 0.3664924 0.3778353 0.5404569
## [3,] 0.1937752 0.6262491 0.6735070 0.1566324

apply(c,1,mean)

## [1] 0.3580355 0.5366726 0.4125409

margin=1,表示行;margin=2,表示列;FUN为函数

5.1.6 综合运用数据处理解决实际问题

请对下表中学生成绩设置一个衡量指标,并将前20%评级为A,前21-40%为B,以此类推,并按成绩等级排序。

student name math chinese english
Zhang Fei 502 79 15
Luo Jian 600 98 19
Wang Lei 410 69 12
Li Jian 626 88 13
Na Yin 412 66 9
Chen Jian 511 77 10

1)解决思路,由于3科成绩差异较大,可以对其先做均一化即标准化处理,

复制代码
student <- c("Zhang Fei","Luo Jian","Wang Lei","Li Jian","Na Yin","Chen Jian")
math <- c(502,600,410,626,412,511)
chinese <- c(79,98,69,88,66,77)
english <- c(15,19,12,13,9,10)
study <- data.frame(student,math,chinese,english)
study

##     student math chinese english
## 1 Zhang Fei  502      79      15
## 2  Luo Jian  600      98      19
## 3  Wang Lei  410      69      12
## 4   Li Jian  626      88      13
## 5    Na Yin  412      66       9
## 6 Chen Jian  511      77      10

z <- scale(study[,2:4])
z

##              math     chinese    english
## [1,] -0.089939481 -0.04185603  0.5504819
## [2,]  0.989334292  1.54867305  1.6514456
## [3,] -1.103135268 -0.87897660 -0.2752409
## [4,]  1.275672232  0.71155248  0.0000000
## [5,] -1.081109273 -1.13011277 -1.1009638
## [6,]  0.009177498 -0.20928014 -0.8257228
## attr(,"scaled:center")
##     math  chinese  english 
## 510.1667  79.5000  13.0000 
## attr(,"scaled:scale")
##     math  chinese  english 
## 90.80180 11.94571  3.63318

score <- apply(z,1,mean)
study <- cbind(study,score)
study

##     student math chinese english      score
## 1 Zhang Fei  502      79      15  0.1395621
## 2  Luo Jian  600      98      19  1.3964843
## 3  Wang Lei  410      69      12 -0.7524509
## 4   Li Jian  626      88      13  0.6624082
## 5    Na Yin  412      66       9 -1.1040619
## 6 Chen Jian  511      77      10 -0.3419418

2)对不同的成绩分级

复制代码
y <- quantile(score,c(.8,.6,.4,.2))
y

##        80%        60%        40%        20% 
##  0.6624082  0.1395621 -0.3419418 -0.7524509

study$grade <- NA
study$grade[score>=y[1]] <- "A"
study$grade[score<y[1]&score>=y[2]] <- "B"
study$grade[score<y[2]&score>=y[3]] <- "C"
study$grade[score<y[3]&score>=y[4]] <- "D"
study$grade[score<y[4]] <- "E"
study

##     student math chinese english      score grade
## 1 Zhang Fei  502      79      15  0.1395621     B
## 2  Luo Jian  600      98      19  1.3964843     A
## 3  Wang Lei  410      69      12 -0.7524509     D
## 4   Li Jian  626      88      13  0.6624082     A
## 5    Na Yin  412      66       9 -1.1040619     E
## 6 Chen Jian  511      77      10 -0.3419418     C

3)将学生名字分为Last name和first name,并用它们替代原来的名字

复制代码
name <- strsplit(study$student," ")
name

## [[1]]
## [1] "Zhang" "Fei"  
## 
## [[2]]
## [1] "Luo"  "Jian"
## 
## [[3]]
## [1] "Wang" "Lei" 
## 
## [[4]]
## [1] "Li"   "Jian"
## 
## [[5]]
## [1] "Na"  "Yin"
## 
## [[6]]
## [1] "Chen" "Jian"

Lastname <- sapply(name, "[",1)
Firstname <- sapply(name, "[",2)
study <- cbind(Firstname,Lastname,study[,-1])
study

##   Firstname Lastname math chinese english      score grade
## 1       Fei    Zhang  502      79      15  0.1395621     B
## 2      Jian      Luo  600      98      19  1.3964843     A
## 3       Lei     Wang  410      69      12 -0.7524509     D
## 4      Jian       Li  626      88      13  0.6624082     A
## 5       Yin       Na  412      66       9 -1.1040619     E
## 6      Jian     Chen  511      77      10 -0.3419418     C

4)最后,按成绩登记排序

复制代码
study <- study[order(study$grade),]
study

##   Firstname Lastname math chinese english      score grade
## 2      Jian      Luo  600      98      19  1.3964843     A
## 4      Jian       Li  626      88      13  0.6624082     A
## 1       Fei    Zhang  502      79      15  0.1395621     B
## 6      Jian     Chen  511      77      10 -0.3419418     C
## 3       Lei     Wang  410      69      12 -0.7524509     D
## 5       Yin       Na  412      66       9 -1.1040619     E

sapply()是一种非常有用的函数,它用于对向量、列表或数据框中的每个元素应用一个函数,并返回结果向量或矩阵。

"["是一个可以提取某个对象的一部分的函数

5.2 控制流

概念:正常情况下R是自上而下顺序执行。但有时希望重复执行某些语句,仅在满足特定条件下执行另外的语句。这就是控制流发挥作用的地方。

语句(statement):一条单独的R语句或一组复合语句(包含在花括号{}中的一组R语句,使用分号分隔);一条完整的执行指令或命令,用于执行特定的操作或计算。它是R语言中的基本执行单位,可以包含变量赋值、函数调用、条件语句、循环等操作。执行一个语句可以产生相应的结果或改变程序的状态。R中的语句通常以换行符或分号作为结束符号,表示一条语句的结束。

条件(cond):通常指的是条件语句的条件部分,用于控制程序的执行流程。条件语句根据给定的条件判断是否执行特定的代码块。在R中,常见的条件语句包括if语句和switch语句;

表达式(expr):一条数值或字符串的求值语句;

序列(seq):一个数值或字符串序列。

5.2.1 重复和循环

循环结构重复执行一个或一系列语句,直到某个条件不为真为止。包括for和while结构。

5.2.1.1 For 结构

for循环重复执行一个语句,直到某个变量的值不再包含在序列seq中为止。语法:

复制代码
for(variable in sequence) statement

举例,这里a也可以用i或m等任意字母替代:

复制代码
for(a in 1:10) print(a+2)

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 11
## [1] 12

sum <- 0
for(a in 1:5){sum <- sum+a} 
print(sum)

## [1] 15
5.2.1.2 while结构

while循环重复执行一个语句,直到条件不为真为止。语法:

复制代码
while(cond) statment

举例:

复制代码
i <- 10
while(i>0) {print("hello");i <- i-1}

## [1] "hello"
## [1] "hello"
## [1] "hello"
## [1] "hello"
## [1] "hello"
## [1] "hello"
## [1] "hello"
## [1] "hello"
## [1] "hello"
## [1] "hello"

5.2.2 条件语句

在条件执行结构中,一条或一组语句仅在满足一个指定条件时执行。包括if-else,ifelse和switch

5.2.2.1 If-else结构

语法一:

复制代码
if(condition) statment

语法二

复制代码
if(condition) {statment1(TRUE)} else {statment2(FALSE)}

举例:

复制代码
i <- 5
if(i>1) {print("i>0")} else {print("i<0")}

## [1] "i>0"
5.2.2.2 ifeslse结构

是if-else的紧奏版,语法:

复制代码
ifelse(condition,statment1(TRUE),statment2(FALSE))

举例:

复制代码
i <- -2
a <- ifelse(i>0,print("i>0"),print("i<0"))

## [1] "i<0"

a

## [1] "i<0"
5.2.2.3 switch结构

switch是一种条件分支语句,用于根据一个表达式的值选择不同的执行路径。switch语句可以根据表达式的值在一系列选项中进行匹配,并执行相应的操作。

复制代码
switch(expr,...)

其中EXPR是一个表达式,用于进行匹配;...是一系列选项,每个选项可以是任意R表达式。

举例:

复制代码
feeling <- c("sad","happy")
for(i in feeling)
  print(
    switch (i,
            happy="I am gald",
            afriad="There us nothing to fear",
            sad="cheer up",
            angry="calm down"))

## [1] "cheer up"
## [1] "I am gald"

5.3 数据重塑

5.3.1 转置(反转行和列)

使用**t()**函数实现

利用mtcar数据集举例:

复制代码
cars <- mtcars[1:5,1:4]
cars

##                    mpg cyl disp  hp
## Mazda RX4         21.0   6  160 110
## Mazda RX4 Wag     21.0   6  160 110
## Datsun 710        22.8   4  108  93
## Hornet 4 Drive    21.4   6  258 110
## Hornet Sportabout 18.7   8  360 175

cars1 <- t(cars)
cars1

##      Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout
## mpg         21            21       22.8           21.4              18.7
## cyl          6             6        4.0            6.0               8.0
## disp       160           160      108.0          258.0             360.0
## hp         110           110       93.0          110.0             175.0

注意:函数t()始终返回一个矩阵,因此只能有一种数据类型。原来的数据集中所有变量都是数值型或逻辑型时转置操作效果最好。若数据集中包含任何字符型变量,转置的结果为整个数据集均被转化为字符型。

**transpose()**函数可以在转置的同时保持原数据类型。需要安装R包。

5.3.1.2 将宽表数据集格式转换为长表数据集格式

概念

1.宽表格式(Wide Format):宽表格式通常以行为单位,每一行表示一个观察或实体,而每一列表示一个变量。每个变量都有自己的列,数据以矩阵形式排列。宽表格式适合于数据集较小且变量数量相对较少的情况。

举例:

Name country math English Chinese
FR France 90 89 79
BS China 99 79 88
GER USA 89 80 96

2.长表格式(Long Format):长表格式通常以观察为单位,每一行表示一个观察或实体的一个特定变量的取值。数据以多个变量和值的形式排列,每个观察可以有多行。长表格式适合于数据集较大且变量数量较多的情况,尤其是在涉及到多个时间点或重复测量的情况下。

举例

5.3.2.2 相互转换

由于不同的分析方式要求不同的格式,例如聚类分析要求数据为宽表格,而回归分析则需要长表格。

大多数R函数使用宽表格式的数据框,可以使用tidyr包进行相互转换.

1)tidyr包中的**gather()**函数可以将宽表格式转化为长表格式,语法如下:

复制代码
longdata <- gather(widedata, key, value, 
                   variable list)

widedata是要转化的数据框;

key指变量列的名称(本例中为Variable)

value指定值列的名称(本例中为score)

variable list指要堆叠的变量(本例中为math,English和chinese)

2)spread()函数将长表格式转化为宽表格式,语法:

复制代码
widedata <- spread(longdata, key, value)

longdata:待转化的数据框;

key:包含变量的列

value:包含变量的列

5.4 数据汇总

使用aggregate()函数,语法:

复制代码
aggregate(formula, data, FUN, ...)

1.formula是一个公式,用于指定被聚合的变量和分组变量之间的关系。一般形式是被聚合的变量 ~ 分组变量。data是包含数据的数据框或列表。

2.FUN是一个聚合函数,用于指定对被聚合的变量进行聚合时所应用的操作。常见的聚合函数包括mean(均值)、sum(求和)、max(最大值)、min(最小值)等。3. ...是可选的参数,用于传递给聚合函数的其他参数。

举例:

复制代码
data <- data.frame(
  Group = c("A", "A", "B", "B", "A", "B"),
  Value = c(10, 15, 8, 12, 6, 9)
)
result <- aggregate(Value ~ Group,data,mean)
result

##   Group     Value
## 1     A 10.333333
## 2     B  9.666667

完整教程请查看

R语言基础学习手册

相关推荐
dorabighead1 小时前
重构版:JavaScript 的 new 操作符——从“黑箱仪式”到“亲手造物”的认知跃迁
开发语言·javascript·重构
Humbunklung1 小时前
C#中通过Response.Headers设置自定义参数
开发语言·c#
Trouvaille ~2 小时前
【Java篇】一法不变,万象归一:方法封装与递归的思想之道
java·开发语言·面向对象·javase·递归·方法·基础入门
wtrees_松阳2 小时前
【编程向导】-JavaScript-基础语法-类型检测
开发语言·javascript·原型模式
qq_529835352 小时前
Java实现死锁
java·开发语言·python
knightkkzboy2 小时前
《C语言中的“三元精灵”:条件操作符的魔法与奥秘》
c语言·开发语言
岱宗夫up2 小时前
C语言零基础入门:嵌入式系统开发之旅
c语言·开发语言·学习
牧小七2 小时前
Java --- 根据身份证号计算年龄
java·开发语言
字节源流2 小时前
【SpringMVC】常用注解:@RequestParam
java·开发语言
绛洞花主敏明2 小时前
go中实现子模块调用main包中函数的方法
开发语言·后端·golang