删除data.table每列的前导零

时间:2018-12-09 10:31:13

标签: r data.table

我有一个数据表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 :(得分: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

答案 1 :(得分:0)

您似乎正在尝试将每列的所有初始0值行替换为NA

在这种情况下,最好使用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]))
       )
}

答案 2 :(得分:0)

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

int

答案 3 :(得分:0)

这里是替代版本,也可以在基本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))