使用na_if将特定值替换为NA

时间:2019-02-15 06:40:25

标签: r dataframe

我的数据框只有几个值,例如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值,并返回相同的旧数据帧。 感谢您的帮助

1 个答案:

答案 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,但不要在括号中插入)。