繁体   English   中英

替换数据框中的 NA,保持列值分布

[英]Replace NA in a dataframe, keeping the column value distribution

问题

我有一个数据框(~15000 行,90 列),其中的列包含 NA。 在这里,我发现了多个关于用另一个 df 或正态分布的值填充 NA 的问答。 但是这些答案将破坏列本身的当前分布。 例子:

Person_ID 变量1 变量2
一个 1 不适用
不适用 2
C 2 不适用
D 1 4
1 3
F 1 1
G 不适用 不适用
H 不适用 1
2 2
Ĵ 1 不适用
ķ 1 3
大号 不适用 4

Var1 的列具有 75% (1) 和 25% (2) 的分布。 一个 NA 应替换为“2”,其他的应替换为“1”。 Var2 有四个值均为 25%,每个 NA 应替换为其中一个值。 实际数据帧更大,其中每列具有有限数量的唯一数值。 真实数据由医疗保健信息组成,不得对外共享。

提问的原因

目标是对数据帧执行 t-SNE,因此必须执行 kNN 插补。 插补将花费更多时间,然后替换以快速查看结果。 答案将使快速浏览成为可能。

在基础 R 中,您可以执行以下操作:

set.seed(5)  
data.frame(lapply(df,\(x)replace(x,is.na(x),sample(na.omit(x),sum(is.na(x))))))

   Person_ID Var1 Var2
1          A    1    3
2          B    1    2
3          C    2    1
4          D    1    4
5          E    1    3
6          F    1    1
7          G    1    3
8          H    1    1
9          I    2    2
10         J    1    1
11         K    1    3
12         L    2    4

为了保持值的比例,除了@onyambu的建议之外,建议在生成样本时包括值的概率。

df[,-1] <- data.frame(apply(df[,-1], 
                            2, 
                            function(x) 
                              replace(x, is.na(x),
                                      sample(sort(unique(na.omit(x))), 
                                             sum(is.na(x)), 
                                             replace = TRUE, 
                                             prob = prop.table(table(x))))))

输出:

> df
   Person_ID Var1 Var2
1          A    1    4
2          B    1    2
3          C    2    2
4          D    1    4
5          E    1    3
6          F    1    1
7          G    1    3
8          H    1    1
9          I    2    2
10         J    1    4
11         K    1    3
12         L    1    4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM