我的数据框只有几个值,例如9.969210e + 36,我想用NA代替它们。看起来像
# A tibble: 1,308 x 3
IMD CRU dts
<dbl> <dbl> <date>
1 9.97e36 9.97e36 1901-01-01
2 9.97e36 9.97e36 1902-01-01
3 9.97e36 9.97e36 1903-01-01
4 9.97e36 9.97e36 1904-01-01
dput(head(df))
structure(list(IMD = c(9.96920996838687e+36, 9.96920996838687e+36,
9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36,
9.96920996838687e+36), CRU = c(9.96920996838687e+36, 9.96920996838687e+36,
9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36,
9.96920996838687e+36), dts = structure(c(-25202, -24837, -24472,
-24107, -23741, -23376), class = "Date")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -6L))
我跟随R - Replace specific value contents with NA为
df %>% mutate_at(vars(IMD, CRU), na_if, 9.969210e+36)
df %>% na_if(x=as.vector(df$IMD),y=9.97e36)
以上都不显示NA值,并返回相同的旧数据帧。 感谢您的帮助
答案 0 :(得分:0)
na_if
适用于 vectors ,而不适用于 data.frame ,因此您首次尝试使用mutate
是最正确的。此外,它比较 exact 值以替换为NA
。
但是,非常大的值仅以15位数字显示。我怀疑还有很多很多。因此,没有任何值与您的条件(y
)完全匹配。尝试与实值进行精确比较时,这是一个常见问题。
还请注意,您正在尝试比较两个值。哪个最大?
9.969210e+36
9.96920996838687e+36
您可以通过以下方式快速完成操作:
df %>%> mutate(
IMD=ifelse(IMD > 9e36, NA, IMD),
CRU=ifelse(CRU > 9e36, NA, CRU)
)
或创建一个函数,
na_when_larger <- function(x, y) {
x[x > y] <- NA
x
}
df %>% mutate_at(vars(IMD, CRU), na_when_larger, 9.96e+36)
(尝试在控制台的中插入na_if
,但不要在括号中插入)。