首页 文章

删除data.table的每列的前导零

提问于
浏览
0

我有一个数据表 DT ,并希望用 NA 替换每列的前导零 .

for (n in 1:ncol(DT)) {
  tmp <- as.vector(unlist(DT[,..n]))
  tmp[cumsum(tmp) == 0] <- NA
}

但现在我不知道如何将矢量 tmp 分配回 DT 的第n列 .

如何创建 tmp 并不令人满意 .

4 回答

  • 0

    这是一个替代版本,也适用于base R (即如果DT是 data.frame

    DT[!sapply(DT, duplicated) & DT == 0] <- NA
    > DT
        n  m
    1: NA  1
    2:  1 NA
    3:  0  2
    

    数据:

    DT <- data.table(n = c(0, 1, 0), m = c(1, 0, 2))
    
  • 0

    看起来您正试图用 NA 替换每列的所有初始0值行 .

    在这种情况下,最好使用 set

    for (jj in names(DT)) {
      set(DT, 1:(which.min(DT[[jj]] == 0) - 1L), jj, NA)
    }
    

    注意:您可能需要更加小心 NA ,因为您必须根据列类型提供正确的 NA .

    types = sapply(DT, typeof)
    for (jj in names(DT)) {
      set(DT, 1:(which.min(DT[[jj]] == 0) - 1L), jj,
          switch(types[jj],
                 'logical'   = NA,
                 'integer'   = NA_integer_,
                 'numeric'   = NA_real_,
                 'character' = NA_character_,
                 'complex'   = NA_complex_,
                 stop("No known NA value for type", types[jj]))
           )
    }
    
  • 0

    我不知道'前导零'是否意味着'每列的第一个零' . 在这种情况下,你可以做这样的事情:

    DT[, lapply(.SD, function(x) ifelse(x == 0 & !duplicated(x), NA, x))]
    
    #     n  m
    # 1: NA  1
    # 2:  1 NA
    # 3:  0  2
    

    如果你的意思是“第一行中的任何零”,那么:

    DT[, lapply(.SD, function(x) ifelse(cumsum(x) == 0, NA, x))]
    
    #     n m
    # 1: NA 1
    # 2:  1 0
    # 3:  0 2
    

    数据:

    DT <- data.table(n = c(0, 1, 0), m = c(1, 0, 2))
    
    DT
    
    #    n m
    # 1: 0 1
    # 2: 1 0
    # 3: 0 2
    
  • 0

    如果要用NA替换每列的每个第一个零:

    DT <- data.table(A = c(0, 1, 0, 2), B = c(1, 0, 2, 0), C = c(1, 1, 2, 0))
    DT
    
    # Output
      A B C
    1 0 1 1
    2 1 0 1
    3 0 2 2
    4 2 0 0
    
    # DT to DF
    df <- as.data.frame(DT)
    
    # Replacing each first zero for each column with NA
    for (col in 1:ncol(df)){
      df[min(which(df[, col] == 0)), col] <- NA
    }
    df
    
    # Output
       A  B  C
    1 NA  1  1
    2  1 NA  1
    3  0  2  2
    4  2  0 NA
    

相关问题