【问题标题】:R: replacing <NA> within factor variables as 0R:将因子变量中的 <NA> 替换为 0
【发布时间】:2021-10-15 13:13:36
【问题描述】:

我正在使用 R 编程语言。我有一个包含字符变量和数字变量的数据集 - 我试图用“0”替换此数据中的所有 NA 和空值。对于连续变量,NA/空值应替换为“数字 0”。对于因子变量,NA/空值应替换为“因子 0”。

过去,我使用标准命令将所有 NA 替换为 0(在下面的代码中,“df”表示包含数据的数据框):

df[df == NA] <- 0

我在我的数据上尝试了上述代码,但我仍然注意到在因子变量中,此代码无法将 &lt;NA&gt; 值替换为 0。&lt;NA&gt; 仍然存在。

我尝试了几种方法:

第一种方法:

df[is.na(df)] <- 0

但这不起作用:

Warning message: 
In '[<-.factor'('*tmp*',thisvar, value = 0):
invalid factor level, NA generated

第二种方法:我尝试了因子变量之一

library(car)
df$some_factor_var <- recode(df$some_factor_var, "NA = 0")

但这将“some_factor_var”中的每个值都替换为 0

第三种方法:我再次尝试了因子变量之一

library(forcats)
fct_explicit_na(df$some_factor_var,0)

Error: Can't convert a double vector to a character vector

谁能告诉我如何解决这个问题?有没有办法一次替换所有变量的所有空/缺失/NA值?

谢谢

【问题讨论】:

    标签: r data-manipulation na missing-data


    【解决方案1】:

    使用 tidyverse,尝试:

    library(tidyverse)
    
    df <- 
      tibble(var_numeric = c(1,2,3,NA),
             var_factor = as.factor(c(4,5,6,NA)))
    
    df %>% 
      replace_na(list(var_numeric = 0)) %>% 
      mutate(var_factor = fct_explicit_na(var_factor, "0"))
    
    # A tibble: 4 x 2
      var_numeric var_factor
            <dbl> <fct>     
    1           1 4         
    2           2 5         
    3           3 6         
    4           0 0   
    

    【讨论】:

    • 维拉斯奎兹:谢谢你的回答!
    【解决方案2】:

    对于因子变量,如果新水平 (0) 尚不存在,则需要先将其包含在数据中。

    看这个例子-

    df <- data.frame(a = factor(c(1, NA, 2, 5)), b = 1:4, 
                     c = c('a', 'b', 'c', NA), d = c(1, 2, NA, 1))
    
    #Include 0 in the levels for "a" variable
    levels(df$a) <- c(levels(df$a), 0)
    #Replace NA to 0
    df[is.na(df)] <- 0
    df
    #  a b c d
    #1 1 1 a 1
    #2 0 2 b 2
    #3 2 3 c 0
    #4 5 4 0 1
    
    str(df)
    #'data.frame':  4 obs. of  4 variables:
    # $ a: Factor w/ 4 levels "1","2","5","0": 1 4 2 3
    # $ b: int  1 2 3 4
    # $ c: chr  "a" "b" "c" "0"
    # $ d: num  1 2 0 1
    

    【讨论】:

    • 感谢您的回答!您是否仍然建议首先运行“df[df == NA]
    • 始终使用is.na 检查NA 值。如果您使用我回答中的数据框执行df == NA,您会看到它返回所有NAs。
    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2021-03-13
    • 2020-11-19
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多