我试图通过确定是否应该用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))
谢谢!
答案 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