R - 替换特定列的数据

时间:2013-09-19 16:03:00

标签: r matrix dataframe

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

我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分: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

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