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
4 回答
这是一个替代版本,也适用于base
R
(即如果DT是data.frame
:数据:
看起来您正试图用
NA
替换每列的所有初始0值行 .在这种情况下,最好使用
set
:注意:您可能需要更加小心
NA
,因为您必须根据列类型提供正确的NA
.我不知道'前导零'是否意味着'每列的第一个零' . 在这种情况下,你可以做这样的事情:
如果你的意思是“第一行中的任何零”,那么:
数据:
如果要用NA替换每列的每个第一个零: