在R中,有什么方法可以填充NA并保持可变属性?

qyswt5oh  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(76)

使用zoo::na.fill(0)可以将所有NA填充为0,但这将改变变量属性,例如,变量amount的属性在dataframe md中为num,在zoo::na.fill(0)之后属性变为chr。有什么方法可以像na.fill一样简单地填充na并保留变量属性吗?

md <- data.frame(cat=c('a','b','d',NA,'E',NA),
                 subcat=c('A','C',NA,NA,NA,'D'),
                 amount=c(1,2,NA,5,NA,8)) 

md %>% zoo::na.fill(0)

nbysray5

nbysray51#

这是一个不使用动物园的解决方案。

library(dplyr)
md2 <- md %>% 
  mutate(across(where(is.factor), as.character)) %>% 
  mutate(across(where(is.character), function(x) { replace(x, is.na(x), "0") } )) %>% 
  mutate(across(where(is.numeric), function(x) { replace(x, is.na(x), 0) } )) %>% 
  mutate(across(where(is.character), as.factor))

如果你愿意,你可以把它 Package 成一个自定义的函数,就像zoo的fill-na方法一样容易使用,例如。

FillNA <- function(df){
  df2 <- df %>% 
    mutate(across(where(is.factor), as.character)) %>% 
    mutate(across(where(is.character), function(x) { replace(x, is.na(x), "0") } )) %>% 
    mutate(across(where(is.numeric), function(x) { replace(x, is.na(x), 0) } )) %>% 
    mutate(across(where(is.character), as.factor)) 
  return(df2)
}

以下是类型的验证:

> str(md)
'data.frame':   6 obs. of  3 variables:
 $ cat   : Factor w/ 4 levels "a","b","d","E": 1 2 3 NA 4 NA
 $ subcat: Factor w/ 3 levels "A","C","D": 1 2 NA NA NA 3
 $ amount: num  1 2 NA 5 NA 8

str(FillNA(md))
'data.frame':   6 obs. of  3 variables:
 $ cat   : Factor w/ 5 levels "0","a","b","d",..: 2 3 4 1 5 1
 $ subcat: Factor w/ 4 levels "0","A","C","D": 2 3 1 1 1 4
 $ amount: num  1 2 0 5 0 8
x8diyxa7

x8diyxa72#

一个更新代码,只要标记它

md %>% mutate(across(cat:amount,~ replace(.x,is.na(.x),0)))

相关问题