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
- <NA>
- 1
- 0.5
- <NA>
- 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的值时,我们可以创建一个函数
compute_s_n <- function(n){
x <- 1:n
sum(x)
}
compute_s_n(5)
15
假设我们要得到前1,…,20个,此时我们重复调用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)
可以看出图形呈现二次曲线,因为求和公式:
3.5 向量化和函数型编程
在数据分析时,向量化有时能给我们带来许多便利
x <- 1:10
sqrt(x)
- 1
- 1.4142135623731
- 1.73205080756888
- 2
- 2.23606797749979
- 2.44948974278318
- 2.64575131106459
- 2.82842712474619
- 3
- 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
- 3
- 6
- 10
- 15
- 21
- 28
- 36
- 45
- 55
- 66
- 78
- 91
- 105
- 120
- 136
- 153
- 171
- 190
- 210
- 231
- 253
- 276
- 300
- 325