Mar*_*ová 2 r matrix data.table
我正在尝试用矩阵替换NA - mat- 用零.我正在使用mat[is.na(mat)] <- 0.当我有8945个变量或更小变量的94531观测矩阵时效果很好但我在112039个22752个变量的观测矩阵上尝试它,R表示错误:
if(!nreplace)返回错误(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 ...
Run Code Online (Sandbox Code Playgroud)
更大的外观完全一样.
其他问题:
有什么方法如何使用rbindlist(data, fill=T)和填充零而不是NA?
对于大型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
Run Code Online (Sandbox Code Playgroud)
第一步是找到每列的NA.
myNAs <- lapply(dt, function(x) which(is.na(x)))
Run Code Online (Sandbox Code Playgroud)
接下来,使用for循环迭代列并set在检查列包含缺失值后使用超高效函数填充NA值if.
for(j in seq_along(dt)) if(length(myNAs[[j]]) > 0) set(dt, myNAs[[j]], j, 0)
Run Code Online (Sandbox Code Playgroud)
set 执行替换"就地"(没有任何副本),因此在此操作之后,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
Run Code Online (Sandbox Code Playgroud)