![](/img/trans.png)
[英]Replace the NA value of a cell by the value of another column in the same dataframe
[英]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.