2017-08-08 45 views
2

我有一个很大的data.frame被称为49952 obs的“mat”。 7597个变量,我试图用零代替NAs。这里是我的data.frame如何如何:NA的快速替换 - 一个错误或警告

A B C E F D Q Z . . . 
1 1 1 0 NA NA 0 NA NA 
2 0 0 1 NA NA 0 NA NA 
3 0 0 0 NA NA 1 NA NA 
4 NA NA NA NA NA NA NA NA 
5 0 1 0 1 NA 0 NA NA 
6 1 1 1 0 NA 0 NA NA 
7 0 0 1 0 NA 1 NA NA 
. 
. 
. 

我需要一个快速的工具来取代它们。结果应该是这样的:

A B C E F D Q Z . . . 
1 1 1 0 0 0 0 0 0 
2 0 0 1 0 0 0 0 0 
3 0 0 0 0 0 1 0 0 
4 0 0 0 0 0 0 0 0 
5 0 1 0 1 0 0 0 0 
6 1 1 1 0 0 0 0 0 
7 0 0 1 0 0 1 0 0 
. 
. 
. 

我已经尝试过lapply(mat, function(x){replace(x, is.na(x),0)}) - 没有工作 - mat[is.na(mat)] <- 0 - 错误,也许太慢 - 也link - 没有工作过。

@Sotos已经建议我plyr::rbind.fill(lapply(L, as.data.frame))但它没有工作,因为它使data.frame的379485344观察值和1变量(这是49952x7597),所以我也必须trafnsform它回来。有没有更好的方法来做到这一点?

我data.frame的真实结构:

> str(mat) 
'data.frame': 49952 obs. of 7597 variables: 
$ 6794602 : num 1 NA NA NA NA 0 0 0 0 0 ... 
$ 1008667 : num NA 1 0 NA NA 0 0 0 0 0 ... 
$ 8009082 : num NA 0 1 NA NA NA NA NA NA NA ... 
$ 6740421 : num NA NA NA 1 NA 0 0 0 0 0 ... 
$ 6777805 : num NA NA NA NA 1 NA NA NA NA NA ... 
$ 1001682 : num NA NA NA NA NA 0 0 0 0 0 ... 
$ 1001990 : num NA NA NA NA NA 0 0 0 0 0 ... 
$ 1002541 : num NA NA NA NA NA 0 0 0 0 0 ... 
$ 1002790 : num NA NA NA NA NA 0 0 0 0 0 ... 

注:

,当我试图mat[is.na(mat)] <- 0有一个警告:

> mat[is.na(mat)] <- 0 
Warning messages: 
1: In `[<-.factor`(`*tmp*`, thisvar, value = 0) : 
    invalid factor level, NA generated 
2: In `[<-.factor`(`*tmp*`, thisvar, value = 0) : 
    invalid factor level, NA generated 
> nlevels(mat) 
[1] 0 

Data.frame使用后垫子mat[is.na(mat)] <- 0

> str(mat) 
'data.frame': 49952 obs. of 7597 variables: 
$ 6794602 : num 1 0 0 0 0 0 0 0 0 0 ... 
$ 1008667 : num 0 1 0 0 0 0 0 0 0 0 ... 
$ 8009082 : num 0 0 1 0 0 0 0 0 0 0 ... 
$ 6740421 : num 0 0 0 1 0 0 0 0 0 0 ... 
$ 6777805 : num 0 0 0 0 1 0 0 0 0 0 ... 
$ 1001682 : num 0 0 0 0 0 0 0 0 0 0 ... 
$ 1001990 : num 0 0 0 0 0 0 0 0 0 0 ... 
$ 1002541 : num 0 0 0 0 0 0 0 0 0 0 ... 
$ 1002790 : num 0 0 0 0 0 0 0 0 0 0 ... 

所以问题是:

  1. 是否有更换NA任何其他快捷的方式?
  2. 是警告大不了的?由于使用mat[is.na(mat)] <- 0后的数据看起来像我想要的,但数值太多,所以我无法检查它们是否正确。
+0

'垫[is.na(垫)] = 0'应该是最快的方法,手向下(上稠密矩阵)。如果不是,这是R中的一个明显错误... –

+1

这是一个警告,不是一个错误,它很好地解释了发生了什么,对吧?如果你对数据有影响感到惊讶,也许可以在这里尝试'查看(mat [sapply(mat,is.factor)])'或者'str'而不是'View'。 – Frank

+0

@Frank那么这个问题包含'str(mat)'的输出,并没有任何因素。但是,警告消息根本不符合该输出。 –

回答

2

尝试以下方法:

mat %>% replace(is.na(.), 0) 
+0

它需要比'mat [is.na(mat)] < - 0'更长的时间,但也许我会让它在一夜之间运行,以确定是否会有警告。编辑:它需要更长时间 - 警告。正如我上面写的,我想我会忽略这个警告。 –

+0

您可以检查以下问题以了解该警告消息吗?可能有助于解决。 https://stackoverflow.com/a/16820025/8382207 – Sagar

0

如果怀疑某些列是因子,则可以使用以下代码来检测并将其更改为数字。

inx <- sapply(mat, inherits, "factor") 
mat[inx] <- lapply(mat[inx], function(x) as.numeric(as.character(x))) 

然后尝试以下操作。

mat[] <- lapply(mat, function(x) {x[is.na(x)] <- 0; x}) 
mat 

这里是数据。

mat <- 
structure(list(A = c(1L, 0L, 0L, NA, 0L, 1L, 0L), B = c(1L, 0L, 
0L, NA, 1L, 1L, 0L), C = c(0L, 1L, 0L, NA, 0L, 1L, 1L), E = c(NA, 
NA, NA, NA, 1L, 0L, 0L), F = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_), D = c(0L, 0L, 1L, NA, 
0L, 0L, 1L), Q = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_), Z = c(NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_)), .Names = c("A", "B", "C", "E", 
"F", "D", "Q", "Z"), row.names = c("1", "2", "3", "4", "5", "6", 
"7"), class = "data.frame") 
+0

再次警告消息: '警告消息: 1:在'[< - 。factor'('* tmp *',is.na(x),value = 0): 无效因子水平,产生NA 2:在'[< - 。factor'('* tmp *',is.na(x),value = 0): 无效因子水平,产生NA' 也许我会忽略警告,这不是错误其他情况。 –

+0

@MartinaZapletalová如果你的'str(mat)'输出是正确的,不应该发生,因为所有的列都是'numeric'类。你确定所有这些7597变量都是'numeric'吗?如果其中两个是你可能需要首先将它们转换为数字的因素。 –

+0

所以我尝试这样的: '一个< - 0 为(I在1:NcoI位(垫)){ 如果(类(垫[[I]])== “数字”){ 一个< - 一个1 } 否则{ 一个< - A + 1张 打印(ⅰ) } }' ,并发现存在于垫的问题[[2260]和垫[[2261]所以我看着它和你是对的他们是因素,但我不明白它会如何发生。 –