如何测试 NA 值是否等于零;如果是则替换,如果不是则保留为 NA

How test if an NA value is equal to zero; replace if so, leave as NA if not

编辑为未在示例数据集中包含完整的因素集,这导致原始解决方案中断。

我正在尝试通过确定 NA 是否应替换为 0 或是否保留为 NA 来清理数据集。

下面是一个示例数据集。 'Dom.Supply' 应该等于剩余因子的总和。例如,'Feed'、'Waste'、'Processing' 和 'Other.Uses' 行 3:5 中出现的 NA 都可以替换为 0 作为因子之和值(即 'Food' 和 'Seed')等于 'Dom.Supply 的值。但是,在第 1 行和第 2 行中,NA 必须保留,因为 'Food' 和 'Seed' 的总和不等于 'Dom.Supply'.

Region  Country Group   Item    Year    Production  Imports Stock.Var   Exports Dom.Supply  Feed    Seed    Waste   Processing  Other.Uses  Food
NAm.Oceania Australia   Cereals Rye 1961    11  0   0   2   9   NA  1   NA  NA  NA  7
NAm.Oceania Australia   Cereals Rye 1962    10  0   0   3   7   NA  1   NA  NA  NA  5
NAm.Oceania Australia   Cereals Rye 1963    10  0   0   1   9   NA  2   NA  NA  NA  7
NAm.Oceania Australia   Cereals Rye 1964    14  0   -5  0   9   NA  2   NA  NA  NA  7
NAm.Oceania Australia   Cereals Rye 1965    11  0   5   0   16  NA  2   NA  NA  NA  14

虽然我不得不按如下方式使用 replace 函数(作为示例,但不是我希望使用的操作),但这是用 0 简单地替换 NA,而不是测试 NA =0.

data$AF2 <- 1-((replace(data$Feed, is.na(data$Feed), 0) + (replace(data$Seed,
    is.na(data$Seed), 0)) / data$Dom.Supply))

谢谢!

我会用这个:

DF <- read.table(text = "Dom.Supply  Feed    Seed    Waste   Processing  Other.Uses  Food
9   NA  1   NA  NA  NA  7
7   NA  1   NA  NA  NA  5
9   NA  2   NA  NA  NA  7
9   NA  2   NA  NA  NA  7
16  NA  2   NA  NA  NA  14", header = TRUE)

ix <- rowSums(DF[, -1], na.rm = TRUE) == DF[, 1]
DF[ix,] <- lapply(DF[ix,], function(x) {
  x[is.na(x)] <- 0
  x
})
#  Dom.Supply Feed Seed Waste Processing Other.Uses Food
#1          9   NA    1    NA         NA         NA    7
#2          7   NA    1    NA         NA         NA    5
#3          9    0    2     0          0          0    7
#4          9    0    2     0          0          0    7
#5         16    0    2     0          0          0   14

CathG 的答案应该是一个真实的答案,而不仅仅是作为评论(作为社区 wiki 在此处发布):

DF <- read.table(text = "Dom.Supply  Feed    Seed    Waste   Processing  Other.Uses  Food
9   NA  1   NA  NA  NA  7
7   NA  1   NA  NA  NA  5
9   NA  2   NA  NA  NA  7
9   NA  2   NA  NA  NA  7
16  NA  2   NA  NA  NA  14", header = TRUE)

ix <- rowSums(DF[, -1], na.rm = TRUE) == DF[, 1]
DF[ix, ][is.na(DF[ix, ])] <- 0 
DF
#  Dom.Supply Feed Seed Waste Processing Other.Uses Food
#1          9   NA    1    NA         NA         NA    7
#2          7   NA    1    NA         NA         NA    5
#3          9    0    2     0          0          0    7
#4          9    0    2     0          0          0    7
#5         16    0    2     0          0          0   14

编辑
如果您在 Dom.Supply 列中有 NAsix 将在相应的行中有一个 NA。您可以将 NA 更改为 FALSE(因为您想将其他列中的 NAs 保留为 NAs):

ix <- rowSums(DF[, -1], na.rm = TRUE) == DF[, 1]
ix[is.na(ix)] <- FALSE
DF[ix, ][is.na(DF[ix, ])] <- 0 

例子,同原文DF:

DF[2, 1] <- NA
ix <- rowSums(DF[, -1], na.rm = TRUE) == DF[, 1]
ix[is.na(ix)] <- FALSE
DF[ix, ][is.na(DF[ix, ])] <- 0 
DF
#  Dom.Supply Feed Seed Waste Processing Other.Uses Food
#1          9   NA    1    NA         NA         NA    7
#2         NA   NA    1    NA         NA         NA    5
#3          9    0    2     0          0          0    7
#4          9    0    2     0          0          0    7
#5         16    0    2     0          0          0   14