1

我正在连接到我的 Vertica 数据库并检索大量数据。数据集中所有列中都有 NA。但我想从特定列中找到 NA 并替换为 0。

我该怎么做?

谢谢 !

4

1 回答 1

2

为了扩展我的评论并将其变成答案,这是一个最小的可重现示例:

set.seed(1)
mydf <- as.data.frame(matrix(sample(c(1:2, NA), 50, replace = TRUE), ncol = 10))
mydf
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1  1 NA  1  2 NA  2  2 NA NA  NA
# 2  2 NA  1 NA  1  1  2 NA  2   1
# 3  2  2 NA NA  2  2  2  1 NA   2
# 4 NA  2  2  2  1 NA  1 NA  2  NA
# 5  1  1 NA NA  1  2 NA  2  2  NA

现在,如果我们想NA用“0”替换,但仅在第 1、3、7 和 8 列中,您可以使用:

mydf[c(1, 3, 7, 8)][is.na(mydf[c(1, 3, 7, 8)])] <- 0
mydf
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1  1 NA  1  2 NA  2  2  0 NA  NA
# 2  2 NA  1 NA  1  1  2  0  2   1
# 3  2  2  0 NA  2  2  2  1 NA   2
# 4  0  2  2  2  1 NA  1  0  2  NA
# 5  1  1  0 NA  1  2  0  2  2  NA

您可以使用列名向量代替列数字索引位置(这将比数字位置更安全)。此外,如果您正在处理的列名或索引位置的向量存储在单独的向量中,您的代码可能会更容易。下面演示了这两个概念,我们将NA变量“V2”、“V4”和“V5”中的值替换为“-999”。

changeMe <- c("V2", "V4", "V5")
mydf[changeMe][is.na(mydf[changeMe])] <- -999
mydf
#   V1   V2 V3   V4   V5 V6 V7 V8 V9 V10
# 1  1 -999  1    2 -999  2  2  0 NA  NA
# 2  2 -999  1 -999    1  1  2  0  2   1
# 3  2    2  0 -999    2  2  2  1 NA   2
# 4  0    2  2    2    1 NA  1  0  2  NA
# 5  1    1  0 -999    1  2  0  2  2  NA
于 2013-09-19T16:37:08.513 回答