2.R语言编程基础

R语言作为统计学界的计算机语言,在数据分析方面有着其独特的优势,我们可以通过R进行探索性数据分析,构建数据分析管道,以及数据可视化等。本章主要介绍一下R语言的一些编程基础

2.1 条件表达式

条件表达式属于流程控制的一部分,是编程最基础的一部分内容。最常见的是if-else语句,具体语法如下

a <- 5
if (a!=0){
    print(1/a)
} else{
    print('No reciprocal for 0')
}
[1] 0.2

我们使用美国谋杀的数据,求出谋杀率murder_rate

library(dslabs)
data(murders)
murder_rate <- murders$total / murders$population*100000
ind <- which.min(murder_rate)
ind

46

如果谋杀率小于0.5,则我们输出对应的州

if(murder_rate[ind]<0.5){
    print(murders$state[ind])
} else{
    print("No state has murder rate that low")
}
[1] "Vermont"

现在我们改成0.25

if(murder_rate[ind]<0.25){
    print(murders$state[ind])
} else{
    print("No state has murder rate that low")
}
[1] "No state has murder rate that low"

和if-else语句效果类似的就是ifelse()函数,有三个参数,第一个是判断语句,如果成立返回第二个参数,如果不成立,返回第三个值

# if else
a <- 0
ifelse(a>0,1/a,NA)

<NA>

ifelse还适用于向量的判断。它检查逻辑向量的每个元素,如果为真,则返回第二个参数;如果条目为假,则返回第三个参数。

a <- c(0,1,2,-4,5)
result <- ifelse(a>0, 1/a, NA)
result
  1. <NA>
  2. 1
  3. 0.5
  4. <NA>
  5. 0.2

还有一个应用场景,当数据存在缺失值时,直接运算会报错,此时我们一般选择吧空值删除或替换,下面给出了一种替换空值的方法

na_example <- c(NA,1,5,NA)
no_nas <- ifelse(is.na(na_example), 0, na_example)
sum((no_nas))

6

针对布尔值运算,any()和all()函数,

  • any()函数,如果有一个为真,则为真
  • all()函数,如果有一个为假,则为假
z <- c(TRUE, TRUE, FALSE)
any(z)
all(z)

TRUE

FALSE

2.2 函数定义

avg <- function(x){
    s <- sum(x)
    n <- length(x)
    s/n
}
x <- 1:100
avg(x)

50.5

3.4 for循环

假设我们要计算序列1+2+…+n的值R语言怎么写脚本 r语言如何编程_数据分析时,我们可以创建一个函数

compute_s_n <- function(n){
  x <- 1:n
  sum(x)
}
compute_s_n(5)

15

假设我们要得到前1,…,20个R语言怎么写脚本 r语言如何编程_数据分析,此时我们重复调用20次函数显然不合适,因此要使用循环来使我们的代码更简洁

首先我们来看一下for循环的基本语法

# 打印1到5
for (i in 1:5) {
    print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
m <- 25
s_n <- vector(length = m) # 先生成一个空列表
for (n in 1:m){ 
    s_n[n] <- compute_s_n(n) #接受函数值
}
n <- 1:m
plot(n, s_n)

R语言怎么写脚本 r语言如何编程_向量化_03

可以看出图形呈现二次曲线,因为求和公式:R语言怎么写脚本 r语言如何编程_向量化_04

3.5 向量化和函数型编程

在数据分析时,向量化有时能给我们带来许多便利

x <- 1:10
sqrt(x)
  1. 1
  2. 1.4142135623731
  3. 1.73205080756888
  4. 2
  5. 2.23606797749979
  6. 2.44948974278318
  7. 2.64575131106459
  8. 2.82842712474619
  9. 3
  10. 3.16227766016838

R中一般不使用for循环,因为使用向量化操作会更简单,但是不是所有的函数都能使用向量化,这是我们需要进行处理

# 例如求和
n <- 1:25
compute_s_n(n)
Warning message in 1:n:
"numerical expression has 25 elements: only the first used"

我们使用sapply函数,就可以对每个元素进行处理,类似python中的apply

n <- 1:25
s_n <- sapply(n, compute_s_n)
s_n
  1. 1
  2. 3
  3. 6
  4. 10
  5. 15
  6. 21
  7. 28
  8. 36
  9. 45
  10. 55
  11. 66
  12. 78
  13. 91
  14. 105
  15. 120
  16. 136
  17. 153
  18. 171
  19. 190
  20. 210
  21. 231
  22. 253
  23. 276
  24. 300
  25. 325