r 用填充的数据扩展数据集

标签 r dplyr apply reshape

我有一个包含 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} 组合的函数。对于等于 0n,我使用了 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/

相关文章:

r - 使用逗号分隔的长度不等的数字字符串对多列进行数学运算

r - 带有 IF 语句的函数适用于多列

python - Pandas 表示可以处理字符串的函数

R:rCharts 和 Shiny:人力车图不会显示

r - 在比较应该相同的两行时识别不匹配的列

r - 使用 dplyr 连接一列

r - 如何按组跨行获得重复的平均值

javascript - 在 JavaScript 中将数组作为内置函数参数传递

R ggtree : How to label single tree tip with ggtree similar to labeling nodes with geom_cladelabel

performance - 我应该养成删除 R 中未使用的变量的习惯吗?