问题描述
我希望在 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