NA中的NA替换功能

时间:2017-08-23 12:12:11

标签: r matrix data.table

我正在尝试用零替换矩阵中的NA - mat - 。我正在使用mat[is.na(mat)] <- 0。当我有94531个18946变量或更小变量的矩阵时它运行良好,但我在112039个22752变量的观测矩阵上尝试,R显示错误:

  

if(!nreplace)return(x)出错:缺少值需要TRUE / FALSE
  另外:警告信息:
  总和(i,na.rm = TRUE):整数溢出 - 使用sum(as.numeric(。))

我不知道我做错了什么,我不明白错误。

以下是我的数据结构示例。

small data.matrix :(由真实数据源制作)

> str(mat)
Classes 'data.table' and 'data.frame':  94531 obs. of  18946 variables:
 $ 6316506: num  1 0 NA NA NA NA NA NA NA NA ...
 $ 6794602: num  0 1 NA NA NA NA NA 0 0 0 ...
 $ 1008667: num  NA NA 0 1 0 NA NA 0 0 0 ...
 $ 6312454: num  NA NA 1 0 0 NA NA 0 0 0 ...
 $ 8009082: num  NA NA 0 0 1 NA NA NA NA NA ...
 $ 1023293: num  NA NA NA NA NA 1 NA NA NA NA ...
 $ 6740421: num  NA NA NA NA NA 1 NA 0 0 0 ...
 $ 6777805: num  NA NA NA NA NA NA 1 NA NA NA ...
 $ 1000558: num  NA NA NA NA NA NA NA 0 0 0 ...
 $ 1001682: num  NA NA NA NA NA NA NA 0 0 0 ...

大看起来完全一样。

其他问题:

在某种程度上如何使用rbindlist(data, fill=T)并填充零而不是NA?

1 个答案:

答案 0 :(得分:6)

使用大型data.table,set函数通常是在变量中替换的方法。

在此应用程序中,您可以分两步获得所需的结果。

  1. 查找每个变量的NAs位置并返回一个列表。
  2. 使用data.table&#39; set函数替换值。
  3. 我构建了一个data.table作为可重现的例子。

    set.seed(1234)
    dt <- data.table(matrix(sample(c(NA, rnorm(4)), replace=TRUE, 50), 10))
    This looks like
    dt
                V1         V2         V3         V4         V5
     1:  1.0844412         NA -2.3456977 -2.3456977 -1.2070657
     2:  0.2774292 -1.2070657         NA -2.3456977  1.0844412
     3:  1.0844412 -1.2070657  0.2774292  0.2774292         NA
     4:  0.2774292 -1.2070657 -1.2070657  1.0844412 -1.2070657
     5: -1.2070657         NA -1.2070657 -1.2070657  1.0844412
     6: -2.3456977         NA  0.2774292  1.0844412  0.2774292
     7: -1.2070657 -1.2070657         NA -1.2070657         NA
     8: -2.3456977 -2.3456977  1.0844412  0.2774292  0.2774292
     9: -1.2070657  0.2774292 -1.2070657  1.0844412  0.2774292
    10: -1.2070657 -2.3456977 -1.2070657  0.2774292  1.0844412
    

    第一步是找到每列的NA。

    myNAs <- lapply(dt, function(x) which(is.na(x)))
    

    接下来,使用for循环迭代列,并在检查列包含set的缺失值后,使用超高效if函数填充NA值。< / p>

    for(j in seq_along(dt)) if(length(myNAs[[j]]) > 0) set(dt, myNAs[[j]], j, 0)
    

    set执行替换&#34;到位&#34; (没有任何副本),所以在这个操作之后,data.table dt将前NAs替换为0。

    dt
                V1         V2         V3         V4         V5
     1:  1.0844412  0.0000000 -2.3456977 -2.3456977 -1.2070657
     2:  0.2774292 -1.2070657  0.0000000 -2.3456977  1.0844412
     3:  1.0844412 -1.2070657  0.2774292  0.2774292  0.0000000
     4:  0.2774292 -1.2070657 -1.2070657  1.0844412 -1.2070657
     5: -1.2070657  0.0000000 -1.2070657 -1.2070657  1.0844412
     6: -2.3456977  0.0000000  0.2774292  1.0844412  0.2774292
     7: -1.2070657 -1.2070657  0.0000000 -1.2070657  0.0000000
     8: -2.3456977 -2.3456977  1.0844412  0.2774292  0.2774292
     9: -1.2070657  0.2774292 -1.2070657  1.0844412  0.2774292
    10: -1.2070657 -2.3456977 -1.2070657  0.2774292  1.0844412