R语言学习4-缺失值

在R语言中,缺失值分为NA和NaN两种类型。NA表示“不可用”或“缺失”,在涉及NA的操作中通常会产生NA。而NaN则表示非数字,如无限大减无限大。在逻辑运算中,NA的特殊性可能导致意外结果。理解并正确处理这些缺失值对于数据分析至关重要。

缺失值在统计和数据分析中起着重要作用。通常,不能简单的忽略缺失值,而应该仔细研究它们,以了解是否存在潜在的模式或缺失的原因。

两种缺失值

NA

R中,NA用于表示“不可用”或“缺失”(在统计意义上)的任何值。 在本课程中,我们将进一步探索缺失值的价值。

任何涉及NA的操作通常都会产生NA。 为了说明这一点,让我们创建一个向量c(44,NA,5,NA)并将其分配给变量x

> x <- c(44, NA, 5, NA)

看看x * 3的结果是什么:

> x * 3
[1] 132  NA  15  NA

我们可以看到结果向量里,与NA对应的元素的值也是NA

为了让事情更有趣一些,我们来创建一个向量,该向量包含1000个来自标准正态分布元素:

> y <- rnorm(1000)

再创建一个包含1000NA的向量:

> z <- rep(NA, 1000)

现在从上述2000个元素中随机抽取100个元素,我们不知道会有多少个NA会被抽到,也不知道它们的所在位置。

> my_data <- sample(c(y, z), 100)

首先让我们解决第一个问题:我们的NA在数据中的位置。 is.na()函数告诉我们向量的每个元素是否为NA。 在my_data上调用is.na()并将结果赋值给my_na

> my_na <- is.na(my_data)
> my_na
  [1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
 [24]  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE
 [47]  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
 [70] FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
 [93]  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE

在所有看到TRUE的地方,我们就知道my_data的对应元素是NA。 同样,在任何地方看到FALSE,我们就知道my_data的对应元素是我们从标准正态分布中随机抽取的元素之一。

在前面关于逻辑运算符的讨论中,我们引入了==运算符作为测试两个对象之间相等性的方法。 因此,有些人可能会认为表达式my_data == NA产生的结果与is.na()同。 可以试试看

> my_data == NA
  [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
 [48] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
 [95] NA NA NA NA NA NA

结果和is.na()不同。R返回了与my_data长度相同,但是全部都是NA的向量。为什么会这样?这是因为NA不是一个真正的值,只是一个表示缺失值的占位符。因此无法与其他值进行比较,my_data == NA这样的逻辑表达式是不完整的。R别无他法,只能返回这样以一个结果。

如果这有点令人困惑,请不要担心。 关键要点是,在任何可能出现NA的情况下使用逻辑表达式时要谨慎,因为单个NA值可能会使整个脚本出现异常。

现在,回到手头的任务。 现在我们有了一个向量my_na,它对每个NA都为TRUE,对每个数值都为FALSE,我们可以计算数据中NA的总数。

有一个小诀窍,在R中,TRUE会被表示为数字1FALSE会被表示为数字0。因此,如果我们取一堆TRUEFALSE的总和,我们将得出TRUE的总数。这种情况下,我们可以直接使用sum()函数。

> sum(my_na)
[1] 54

NaN

现在我们对NA已经有所了解,让我们看看另一种缺失值——NaN(not a number),表示非数字。可以通过这样一个例子来生成NaN

> 0 / 0
[1] NaN

还有一个有趣的例子,在R中,Inf表示无穷大,如果用Inf减去Inf,结果会是什么?

> Inf - Inf
[1] NaN

结果还是NaN

小结

  • NA表示缺失值,但它不是一个真实值,仅仅是一个占位符。所以在逻辑运算符中如果有NA,要谨慎使用。
  • 任何设计NA的操作都会产生NA
  • NaN表示非数字,比如0 / 0这样无意义的结果,就可以用NaN表示。

本文首发于公众号:柠檬培养师(ID: yantinger90),欢迎关注!

### R语言面板数据缺失值处理方法 在R语言中,针对面板数据的缺失值处理有多种方式可以选择。以下是常见的几种方法及其具体实现: #### 方法一:使用`mice`包进行多重插补 `mice`包是一个强大的工具,能够通过多重插补法来估计并填充缺失值。这种方法适用于各种类型的变量(连续型、分类型等),并且能有效减少因简单替换带来的偏差。 ```r library(mice) # 假设data为含有缺失值的面板数据框 imp_data <- mice(data, method = "pmm", m = 5, maxit = 50, seed = 500) completed_data <- complete(imp_data, 1) # 提取其中一种完整的数据集 ``` 此代码片段展示了如何利用`mice`包完成多重插补操作[^1]。 #### 方法二:基于时间序列的增长率计算填补 如果面板数据具有明显的趋势特征,则可以通过计算年均增长率的方式预测缺失值。这一过程涉及找到每列第一个和最后一个非缺失值之间的变化比率,并以此为基础推算中间年的可能值。 ```r fill_missing_by_growth_rate <- function(x){ non_na_indices <- which(!is.na(x)) if(length(non_na_indices)==0 || length(non_na_indices)<2){return(x)} first_non_na_index <- min(non_na_indices) last_non_na_index <- max(non_na_indices) growth_rate <- (x[last_non_na_index]-x[first_non_na_index])/(last_non_na_index-first_non_na_index) for(i in seq(first_non_na_index+1,last_non_na_index)){ if(is.na(x[i])){ x[i]<-x[i-1]+growth_rate } } return(x) } apply(data, MARGIN=2, FUN=fill_missing_by_growth_rate) ``` 上述脚本定义了一个函数`fill_missing_by_growth_rate()`,它接受向量作为输入参数,并返回经过增长速率调整后的版本[^2]。 #### 方法三:随机森林算法填充值 当样本数量较大且存在复杂的交互关系时,可考虑应用机器学习模型如随机森林来进行更精确的估算。这里介绍的是借助`missForest`库执行单次迭代修复的过程。 ```r install.packages("missForest") # 如果尚未安装该扩展程序的话 library(missForest) result <- missForest(data) imputedData <- result$ximp ``` 这段示范说明了怎样调用`missForest`函数自动寻找最佳匹配项替代NA位置上的原始记录[^3]。 综上所述,在实际项目里可以根据具体情况选用合适的策略组合解决面板数据里的空缺现象。无论是统计学意义还是业务逻辑层面都需要仔细权衡不同方案优劣后再做决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值