通过用R中所有可能值的集合替换缺失值来扩展data.frame

时间:2015-01-13 15:39:48

标签: r

我想通过用所有可能行的集合替换每个不完整的行来扩展我的数据集。有没有人有任何建议可以有效地做到这一点?

例如,假设X和Z都可以取值0或1.

输入:

   id y  x  z
 1  1 0  0 NA
 2  2 1 NA  0
 3  3 0  1  1
 4  4 1 NA NA

输出:

  id y x z
1  1 0 0 0
2  1 0 0 1
3  2 1 0 0
4  2 1 1 0
5  3 0 1 1
6  4 1 0 0
7  4 1 0 1
8  4 1 1 0
9  4 1 1 1

目前我只是逐行处理原始数据集:

for(i in 1:N){

if(is.na(temp.dat$x[i]) & !is.na(temp.dat$z[i])){
    augment <- matrix(rep(temp.dat[i,],2),ncol=ncol(temp.dat),byrow=TRUE)
    augment[,3] <- c(0,1)
}else
if(!is.na(temp.dat$x[i]) & is.na(temp.dat$z[i])){
    augment <- matrix(rep(temp.dat[i,],2),ncol=ncol(temp.dat),byrow=TRUE)
    augment[,4] <- c(0,1)
}else{
if(is.na(temp.dat$x[i]) & is.na(temp.dat$z[i])){
    augment <- matrix(rep(temp.dat[i,],4),ncol=ncol(temp.dat),byrow=TRUE)
    augment[,3] <- c(0,0,1,1)
    augment[,4] <- c(0,1,0,1)
}
}

1 个答案:

答案 0 :(得分:3)

您可以尝试

  1. 创建&#34; indx&#34;计数&#34; NAs&#34;在每一行(rowSums(is.na(...)
  2. 使用&#34; indx&#34;扩展原始数据集(df[rep(1:nrow...
  3. 的行
  4. 循环(sapply)&#34; indx&#34;并将其用作&#34;次&#34; rep中的参数,以及值expand.grid的{​​{1}}来创建&#34; lst&#34;
  5. 0,1展开的数据集&#34; df1&#34;,&#34; id&#34;
  6. 使用split更改相应的&#34; NA&#34; &#34; lst2&#34;中的值通过&#34; lst&#34;
  7. 中的值
  8. Map列表元素

    rbind
  9. 数据

    indx <- rowSums(is.na(df[-1]))
    df1 <- df[rep(1:nrow(df), 2^indx),]
    lst <- sapply(indx, function(x) expand.grid(rep(list(0:1), x)))
    lst2 <- split(df1, df1$id)
    res <- do.call(rbind,Map(function(x,y) {x[is.na(x)] <- as.matrix(y);x},
                              lst2, lst))
    row.names(res) <- NULL
    res
    #  id y x z
    #1  1 0 0 0
    #2  1 0 0 1
    #3  2 1 0 0
    #4  2 1 1 0
    #5  3 0 1 1
    #6  4 1 0 0
    #7  4 1 1 0
    #8  4 1 0 1
    #9  4 1 1 1