R 如何测试NA值是否等于零;如果是,则更换,如果不是,则保留为NA “编辑为”未在示例数据集中包含完整的因素集,这导致原始解决方案中断。

R 如何测试NA值是否等于零;如果是,则更换,如果不是,则保留为NA “编辑为”未在示例数据集中包含完整的因素集,这导致原始解决方案中断。,r,replace,na,R,Replace,Na,我试图通过确定NA是应该替换为0,还是保留为NA来清理数据集 下面是一个示例数据集。”Dom.Supply'应等于剩余因子之和。例如,第3:5行中出现的“饲料”、“废物”、“加工”和“其他用途”的NAs可以分别替换为0,因为具有值(即“食品”和“种子”)的因子之和等于“Dom.Supply”的值。但是,在第1行和第2行中,NAs必须保持为“食物”和“种子”之和不等于“Dom.Supply” Region Country Group Item Year Production I

我试图通过确定NA是应该替换为0,还是保留为NA来清理数据集

下面是一个示例数据集。”Dom.Supply'应等于剩余因子之和。例如,第3:5行中出现的“饲料”、“废物”、“加工”和“其他用途”的NAs可以分别替换为0,因为具有值(即“食品”和“种子”)的因子之和等于“Dom.Supply”的值。但是,在第1行和第2行中,NAs必须保持为“食物”和“种子”之和不等于“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
函数,如下所示(作为示例,但不是我希望使用的操作),但这是将NAs简单地替换为0,而不是NA=0的测试

data$AF2 <- 1-((replace(data$Feed, is.na(data$Feed), 0) + (replace(data$Seed,
    is.na(data$Seed), 0)) / data$Dom.Supply))
data$AF2我会用这个:

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

DFCathG的答案应该是一个真实的答案,而不仅仅是一个评论(以社区维基的形式发布在这里):

例如,使用相同的原始
DF


DF[2,1]那么您希望仅在显示的数字添加到Dom.Supply的行中用0替换NAs?您也可以避免使用
lappy
并执行
DF[ix,][is.na(DF[ix,]]谢谢,@CathG。这似乎是一个更简单的代码,但与罗兰的相比,我很难理解语法(显然,我仍处于初级阶段)。@Expat_Canuck,它只是说在
ix
行中的任何行中用0替换NAs;-)@CathG,如果第1列中有NA,需要什么语法来避免第二行代码中断?用NA替换第1列第2行中的“7”会生成以下错误:
[@Expat\u Canuck,问题是它会导致
ix
中出现
NA
。我想在这种情况下,你想把一切都留给NA吗?我会编辑答案。@Expat\u Canuck,很抱歉回复太晚,我没有收到你评论的通知:-(
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
ix <- rowSums(DF[, -1], na.rm = TRUE) == DF[, 1]
ix[is.na(ix)] <- FALSE
DF[ix, ][is.na(DF[ix, ])] <- 0 
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