微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 R 中创建多个缺失数据点

如何解决在 R 中创建多个缺失数据点

我希望在 R 中创建多个缺失的数据点。

我们将从我的测试数据集开始:

v <- 1:25
matmiss <- matrix(v,nrow = 5)
dfmiss <- as.data.frame(matmiss)

(是的,有一种更简单的方法可以做到这一点,但现在我不在乎)。

对于我丢失的数据,我的代码如下所示:

dfmiss[1,1] <- NA
dfmiss[2,2] <- NA
dfmiss[3,3] <- NA
dfmiss[4,4] <- NA
dfmiss[5,5] <- NA

必须有更简单的方法来做到这一点,对吗?此外,我需要一个瑞士奶酪解决方案——如何随机生成缺失数据?

背景:我的兴趣是改进缺失数据的检测和插值。

解决方法

如果以矩阵格式保留,则更容易完成。

matmiss[diag(matmiss)] <- NA
matmiss
     [,1] [,2] [,3] [,4] [,5]
[1,]   NA    6   11   16   21
[2,]    2   NA   12   17   22
[3,]    3    8   NA   18   23
[4,]    4    9   14   NA   24
[5,]    5   10   15   20   NA

matmiss <- matrix(v,nrow = 5)
N <- 5
matmiss[sample(v,N)] <- NA # "swiss cheese"
matmiss
     [,]   NA   NA   12   NA   22
[3,]    3    8   13   18   23
[4,]    4    9   14   19   24
[5,]    5   10   15   NA   25
,

令人惊讶的是我第一次曾经使用<<-

数据

v <- 1:25
matmiss <- matrix(v,nrow = 5)
dfmiss <- as.data.frame(matmiss)

NoN <- round(nrow(dfmiss)*ncol(dfmiss)/5)

代码

replicate(NoN,dfmiss[sample(nrow(dfmiss),1),sample(nrow(dfmiss),1)] <<- NA)

输出

  V1 V2 V3 V4 V5
1  1  6 11 16 21
2  2  7 NA 17 22
3  3  8 NA 18 23
4  4  9 14 19 24
5  5 NA NA NA 25
,

一个 tidyverse 选项。

library(dplyr)
library(tidyr)

dfmiss %>%
  mutate(id = row_number()) %>%
  pivot_longer(-id) %>%
  mutate(value = if_else(str_sub(name,-1) == id,NA_integer_,value)) %>%
  pivot_wider(names_from = name,values_from = value) %>%
  select(-id)

# # A tibble: 5 x 5
#      V1    V2    V3    V4    V5
#   <int> <int> <int> <int> <int>
# 1    NA     6    11    16    21
# 2     2    NA    12    17    22
# 3     3     8    NA    18    23
# 4     4     9    14    NA    24
# 5     5    10    15    20    NA


dfmiss %>%
  mutate(across(everything(),~ sample(c(.,NA),length(.))))

#   V1 V2 V3 V4 V5
# 1  5  7 11 17 21
# 2  4 10 NA 19 24
# 3  1  9 15 16 22
# 4 NA  8 12 18 NA
# 5  2 NA 14 NA 25

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。