如何测试 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
列中有 NAs
,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
编辑为未在示例数据集中包含完整的因素集,这导致原始解决方案中断。
我正在尝试通过确定 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
列中有 NAs
,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