我正在尝试用零替换矩阵中的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?
答案 0 :(得分:6)
使用大型data.table,set
函数通常是在变量中替换的方法。
在此应用程序中,您可以分两步获得所需的结果。
set
函数替换值。我构建了一个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