我有一个包含 4 列的数据集。目前可以采用 2 个值(1 或 0)。三列(X1、X2、X3)缺少数据。
Row# X1 X2 X3 Y
1 1 0 0 1
2 0 1 1 0
3 NA 0 0 0
4 1 1 1 0
5 1 NA NA 1
6 1 0 0 1
7 NA NA NA 0
8 0 1 0 1
9 NA NA 1 0
10 0 0 1 1
11 NA NA 0 0
12 0 0 0 0
13 0 0 1 1
14 NA 0 NA 0
我感兴趣的是为 NA 的可能值创建一个填充数据集。我的意思是创建可能的数据行,如下所示
Row# X1 X2 X3 Y Probability Comments
1 1 0 0 1 1 No missing
2 0 1 1 0 1 No missing
3 1 0 0 0 0.5 X1 Missing
4 0 0 0 0 0.5 X1 Missing
5 1 1 1 0 1 No missing
6 1 1 0 1 0.25 X1, X2 missing
7 1 0 0 1 0.25 X1, X2 missing
8 1 1 1 1 0.25 X1, X2 missing
9 1 0 1 1 0.25 X1, X2 missing
10 1 0 0 1 1 No missing
11 0 0 0 0 0.125 X1, X2, x3 missing
12 1 0 0 0 0.125 X1, X2, x3 missing
13 0 1 0 0 0.125 X1, X2, x3 missing
14 0 0 1 0 0.125 X1, X2, x3 missing
15 1 1 0 0 0.125 X1, X2, x3 missing
16 1 0 1 0 0.125 X1, X2, x3 missing
17 0 1 1 0 0.125 X1, X2, x3 missing
18 1 1 1 0 0.125 X1, X2, x3 missing
19 . . . . . ......
20 . . . . . ......
21 . . . . . ......
22 . . . . . ......
请注意最终数据集将包含 5 列(X1、X2、X3、Y、可能性)
概率
列是根据此逻辑计算的。
让我们从第一个数据集中的 Row1&2 开始。前两行(1,2) 没有任何缺失数据,因此在预期输出中会生成相同的两行,概率为 1。
让我们看看原始数据集中的 Row3。 X1 列中缺少值。因此,在预期输出中生成了两行 3,4。因此概率为 0.5, 0.5。
1/2=0.5
让我们看看原始数据集中的第 5 行。这包含 X2 和 X3 列中缺失的数据。因此,这将在预期数据中生成 4 行,行# 6,7,8.9。所以概率是 0.25, 0.25,0.25, 0.25,
1/4 = 0.25
原始数据集的第 7 行缺少 x1、x2、x3 的值。因此,此场景将在预期输出数据集中生成 8 行,即第 11 行-第 18 行。因此概率为 0.125 ,
1/8 = 0.125
我可以使用 8 个 ifelse 语句和 for 循环来完成此操作。但我想知道是否有任何更简单、更不那么困惑的方法来实现这一目标。谢谢。
最佳答案
我使用 expand.grid
为任意数字定义了一个用于 {0,1}
组合的函数。对于等于 0
的 n
,我使用了 1 维的 data.frame,以避免没有 NA
的行出现复杂情况。
comb <- function(n) {
if(n==0) return(data.frame(Var1 = c(1)))
expand.grid(rep(list(0:1),n))
}
现在我正在使用应用和替换函数来创建行列表。我使用了 dplyr 中的 mutate 来创建概率列。
df = apply(df, 1, function(v){
NA_count = length(which(is.na(v)))
apply(comb(NA_count) , 1 , FUN = replace , x = v, list =
which(is.na(v))) %>%
t %>% as.data.frame() %>%
mutate( Probability = (1/2)^length(which(is.na(v))))
})
最后,我用 do.call
将所有列表放在一起。
do.call(rbind,df)
关于r 用填充的数据扩展数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61669123/