代码之家  ›  专栏  ›  技术社区  ›  Martina Zapletalová

快速更换NA-错误或警告

  •  5
  • Martina Zapletalová  · 技术社区  · 7 年前

    我有一个大数据。一个名为“mat”的帧,包含49952个obs,7597个变量,我试图用零替换NAs。下面是我的数据的示例。框架看起来像:

        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 -也不起作用。

    @索托斯已经建议我了 plyr::rbind.fill(lapply(L, as.data.frame))

    我的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
    

    数据使用后的框架垫

    > 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. 看起来像我想要的,但是有太多的值,所以我无法检查它们是否正确。
    3 回复  |  直到 7 年前
        1
  •  10
  •   Sagar    7 年前

    mat %>% replace(is.na(.), 0)
    
        2
  •  2
  •   Rui Barradas    7 年前

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

    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")
    
        3
  •  0
  •   ozturkib    5 年前

    here .

    #install.packages("xlsx")
    library(xlsx)
    extracted_df <- read.xlsx("test.xlsx", sheetName='Sheet1', stringsAsFactors=FALSE)
    # Replace all NAs in a data frame with "G" character
    extracted_df[is.na(extracted_df)] <- "G"