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

时间:2015-05-26 13:42:28

标签: r replace na

编辑为没有包含示例数据集中的全部因素,导致原始解决方案中断。

我试图通过确定是否应该用0替换NA,或者如果保留NA作为NA来清理数据集。

以下是示例数据集。 ' Dom.Supply'应该等于剩余因子的总和。例如,出现在行3:5中的用于“Feed'”,“废物'”'处理'和'其他。使用'每个都可以用0代替,因为值的因子总和(即' Food' Seed')等于' Dom.Supply的值。但是,在第1行和第1行中2,NAs必须保留为' Food'和'种子'不等于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))

谢谢!

2 个答案:

答案 0 :(得分:5)

我用这个:

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

答案 1 :(得分:3)

CathG的回答应该是一个真正的答案,不仅仅是作为评论(在这里发布为社区维基):

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

修改
如果您在NAs列中有Dom.Supply,则ix将为相应的行设置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